为什么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设计为在关系发生变化后立即保持变化,而不是等待保存操作?
答案 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 author
,book_id
设置new author
。