将关系设置为nil会立即导致持久性

时间:2012-03-26 18:23:37

标签: activerecord

为什么A / R设计为一旦更改就保持对关系的更改,而不是等待保存操作? (rails 3.1.4)

...

考虑Book and Author的以下模型:

class Book < ActiveRecord::Base
  has_one :author
end

class Author < ActiveRecord::Base
  belongs_to :book
end

以及以下种子数据:

a = Author.new(:name => "Joe Author")
Book.create(:title => "The Book Title", :author => a)

...

获取一本书后,可以调整标题,在调用Book.save之前不会保留任何内容。

但是,当您尝试调整与作者的关系时(例如将其设置为nil),activerecord会立即保持更改。

这似乎是设计的,并且像mongoid这样的其他类似A / R的实现重复。为什么A / R设计为在关系发生变化后立即保持变化,而不是等待保存操作?

1 个答案:

答案 0 :(得分:0)

因此,如果您查看“一对一协会”下的ActiveRecord::Associations documentation section "Unsaved objects and associations"&#34;它说:

  
      
  • 将对象分配给has_one关联会自动保存该对象和要替换的对象(如果有),以便更新其外键 - 除非父对象未保存(new_record?== true)。 / LI>   

且不太相关

  
      
  • 将对象分配给belongs_to关联不会保存对象,因为外键字段属于父对象。它也没有保存父母。
  •   

因此,在这种情况下,您实际上正在更改Author记录而不是Book记录。所以即使你打电话给@book.save它也不会改变关系状态(因为Author持有外键)。

如果您要等到@book.save保存@book.author,则@book对象必须保持{{1}的状态删除old authorbook_id设置new author