Rails:如何持久化?工作?

Ral*_*var 3 activerecord ruby-on-rails

我有两个实例变量:@var_from_new@var_from_find_by

@var_from_new是由

@var_from_new = EmailAddress.new 
Run Code Online (Sandbox Code Playgroud)

@var_from_find_by是由

@var_from_find_by.find_by_email_address(email_address_params[:email_address])
Run Code Online (Sandbox Code Playgroud)

当我用调试器检查这两个变量时,两个实例变量都包含完全相同的内容。然而

@var_from_new.persisted?    # false
@var_from_find_by.persisted # true
Run Code Online (Sandbox Code Playgroud)

Rails 怎么知道的?

Ser*_*sev 5

Rails 怎么知道的?

一条记录从数据库加载,另一条在内存中初始化,尚未持久化。对于大多数字段,它们可能具有相同的值这一事实无关紧要。如果您要问,rails 在做什么,您可以通过以下方式找到:

[1] pry(main)> show-source EmailAddress#persisted?

From: /Users/sergio/.gem/ruby/2.4.2/gems/activerecord-5.1.5/lib/active_record/persistence.rb @ line 98:
Owner: ActiveRecord::Persistence
Visibility: public
Number of lines: 4

def persisted?
  sync_with_transaction_state
  !(@new_record || @destroyed)
end
Run Code Online (Sandbox Code Playgroud)

现在很明显,persisted?使用了一个@new_record您可能在调试器中没有看到/注意到的实例变量。

此代码pry通过pry-rails使用 gem