Activerecord 将relationship设置为nil会导致立即持久性

Activerecord 将relationship设置为nil会导致立即持久性,activerecord,Activerecord,为什么应收账款设计为在关系更改后立即保留对关系的更改,而不是等待保存操作?(第3.1.4条) 考虑以下书籍和作者模型: class Book < ActiveRecord::Base has_one :author end class Author < ActiveRecord::Base belongs_to :book end 获取书籍时,可以调整标题,在调用book.save之前不会保留任何内容 但是,当您尝试调整与作者的关系(例如,将其设置为nil)时,act

为什么应收账款设计为在关系更改后立即保留对关系的更改,而不是等待保存操作?(第3.1.4条)

考虑以下书籍和作者模型:

class Book < ActiveRecord::Base
  has_one :author
end

class Author < ActiveRecord::Base
  belongs_to :book
end

获取书籍时,可以调整标题,在调用book.save之前不会保留任何内容

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

这似乎是在中设计的,并且被其他类似A/R的实现(如mongoid)重复。为什么A/R设计为在关系更改后立即保留对关系的更改,而不是等待保存操作?

因此,如果您在“一对一关联”下签出,它会声明:

  • 将对象指定给has_one关联会自动保存该对象和被替换的对象(如果有),以便更新其外键-除非父对象未保存(新记录?==true)
不那么相关

  • 将对象分配给“所属对象”关联不会保存该对象,因为外键字段属于父对象。它也不会保存父对象
因此,在这种情况下,您实际上是在更改
作者
记录,而不是
书籍
记录。因此,即使调用
@Book.save
它也不会更改关系状态(因为
作者
持有外键)

如果要等到
@book.save
保存
@book.author
时,则
@book
对象必须保持
旧作者的状态,以删除
图书id
,以及
新作者的状态,以设置
图书id

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