【问题标题】:has_one relation automatically set nil if more than onehas_one 关系在多个时自动设置 nil
【发布时间】:2016-04-27 14:36:49
【问题描述】:

给出两个模型,具有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 现在是孤儿记录。

有什么办法可以删除以前的记录而不是设置为零?

【问题讨论】:

  • 为什么不更新之前的shop_info记录,而不是新建一条呢?
  • 我试图阻止其他开发人员在执行此调用时创建孤立记录。对于隔离解决方案,我可以这样做,但我不会在以后的代码中阻止其他开发人员的这种行为。

标签: ruby-on-rails activerecord has-one


【解决方案1】:

默认情况下,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

【讨论】:

  • 这应该被接受为答案!没有已知的依赖选项以这种方式工作。
  • 因为是我自己的答案,所以要等两天才能接受:(
  • @FranMartinez 这是否意味着has_one 中:dependent 的默认值为nullify?
【解决方案2】:

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

association=(associate)

分配关联对象,提取 主键,设置为外键,保存关联 目的。为避免数据库不一致,永久删除一个 分配新对象时现有的关联对象,即使新的 一个没有保存到数据库中。

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

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

【讨论】:

  • 感谢您的建议。我找到了再次阅读文档的解决方案。不幸的是,您的解决方案并没有阻止其他开发人员在尝试执行 create_shop_info 调用时遇到同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
相关资源
最近更新 更多