:dependent => :nullify
为什么我要取消依赖对象,因为我没有看到孤立数据库记录的目的。
答案 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
何时在促销中,但这可能使事情变得过于复杂。