在ActiveRecord中取消依赖对象

use*_*290 7 activerecord ruby-on-rails

:dependent => :nullify
Run Code Online (Sandbox Code Playgroud)

为什么我要使依赖对象无效,因为我没有看到孤立数据库记录的目的.

m_x*_*m_x 22

无效只在非常具体的情况下才有用; 例如,假设您有一些项目,可能会或可能不会一个代理程序调查(因此其引用代理程序的外键字段可以为null).如果代理放弃了他处理的所有调查(让我们说他被解雇了),你不想破坏项目记录,但是你不能让它引用不再存在的代理记录,所以你无效它的外国关键领域.

  • 我知道这是一个旧线程,但另一个例子,当你可能想要这样做时,可以将可计费项目添加到发票中.假设发票错误(用户错误),需要删除.您仍然希望对项目进行计费,这样您就不会希望它们被删除,但您还需要知道它们尚未分配到发票中.在这种情况下,您要删除发票并取消分配该发票上的所有记录以添加到将来的发票中. (5认同)

小智 6

考虑一下我们有许多商店和商品的情况。每个项目可以有许多商店,每个商店可以有许多项目,因此它们通过连接表(或交叉表)链接。假设每个商店也可以进行自己的包含一组商品的促销活动,我们可以将其存储在可选属于促销活动的连接表上。在促销结束时,它可以被销毁,但我们希望保留商店和商品之间的链接,因此我们将取消promotion_id.

class Store
  has_many :store_items, dependent: :destroy
  has_many :items, through: :store_items
end

class Item
  has_many :store_items, dependent: :destroy
  has_many :items, though: :store_items
end

class Promotion
  has_many :store_items, dependent: :nullify
end

class StoreItem
  belongs_to: :item
  belongs_to: :store
  belongs_to: :promotion, optional: true
end
Run Code Online (Sandbox Code Playgroud)

理想情况下,我们可能允许StoreItem具有多个Promotions,然后将日期时间存储在连接表上,以便我们知道 何时StoreItem处于促销活动中,但这可能会使事情变得过于复杂。