在ActiveRecord中取消依赖对象

时间:2011-09-10 08:56:51

标签: ruby-on-rails activerecord

:dependent => :nullify

为什么我要取消依赖对象,因为我没有看到孤立数据库记录的目的。

2 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:0)

考虑一下我们有许多商店和物品的情况。每个项目可以有许多商店,每个商店可以有许多项目,因此它们与联接表(或交叉表)链接。可以说,每个商店还可以进行自己的包含一捆物品的促销活动,我们可以将其存储在联接表上的位置(可选地属于促销活动)。促销结束时,它可以销毁,但我们想保留商店和商品之间的链接,因此我们将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

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