has_one 关系自动设置 nil 如果多于一个

Fra*_*nez 2 activerecord ruby-on-rails has-one

给出一个有has_one关联的两个模型:

class ShopInfo
  belongs_to :shop
end

class Shop
  has_one :shop_info
end


s = Shop.create
ss1 = s.create_shop_info
Run Code Online (Sandbox Code Playgroud)

在我的代码的其他地方,我做

ss2 = s.create_shop_info 
Run Code Online (Sandbox Code Playgroud)

此后,ss1.shop_id 设置为 nil,因此 ss1 现在是孤儿记录。

有没有办法删除以前的记录而不是将它们设置为零?

Fra*_*nez 5

默认情况下, has_one 关联执行nullify. 添加dependent: :destroy解决了问题。

class Shop
  has_one :shop_info, dependent: :destroy
end
Run Code Online (Sandbox Code Playgroud)

如果有人想要更多信息, has_one 替换记录的 ActiveRecord 代码是这样的:

https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/associations/has_one_association.rb#L24-L51

但是,如果您dependent在关联中添加一个选项,delete也会执行该方法:

https://github.com/rails/rails/blob/v4.2.6/activerecord/lib/active_record/associations/has_one_association.rb#L7-L22