has_one关系自动设置为nil(如果不止一个)

时间:2016-04-27 14:36:50

标签: ruby-on-rails activerecord 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

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

ss2 = s.create_shop_info 

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

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

2 个答案:

答案 0 :(得分:4)

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

class Shop
  has_one :shop_info, dependent: :destroy
end

如果有人想要更多信息,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

答案 1 :(得分:1)

Fran,如果你看一下the has_one documentation,我想你想使用association=方法:

  

<强>关联=(准)

     

指定关联对象,提取   主键,将其设置为外键,并保存关联   宾语。为避免数据库不一致,请永久删除   分配新的现有关联对象,即使是新的   一个未保存到数据库。

这意味着您的代码可能看起来像......

ss2.shop_info = ShopInfo.new(...)