Ruby on rails 取消ActiveRecord中的依赖对象

Ruby on rails 取消ActiveRecord中的依赖对象,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,既然我看不出孤立数据库记录有什么用途,为什么我要取消从属对象。取消仅在非常特定的情况下有用;例如,假设您有一些项目,可能由一个代理调查,也可能不由一个代理调查(因此其引用代理的外键字段可以为空)。如果代理放弃了他处理的所有调查(比如说他被解雇了),您不想破坏项目记录,但您不能让它引用不再存在的代理记录,因此您可以将其外键字段置空。考虑一下我们有大量存储和项目的情况。每个项目可以有多个存储,每个存储可以有多个项目,因此它们与联接表(或交叉表)链接。假设每个商店也可以进行自己的包含一组项目的促销,我

既然我看不出孤立数据库记录有什么用途,为什么我要取消从属对象。

取消仅在非常特定的情况下有用;例如,假设您有一些项目,可能由一个代理调查,也可能不由一个代理调查(因此其引用代理的外键字段可以为空)。如果代理放弃了他处理的所有调查(比如说他被解雇了),您不想破坏项目记录,但您不能让它引用不再存在的代理记录,因此您可以将其外键字段置空。

考虑一下我们有大量存储和项目的情况。每个项目可以有多个存储,每个存储可以有多个项目,因此它们与联接表(或交叉表)链接。假设每个商店也可以进行自己的包含一组项目的促销,我们可以将这些项目存储在连接表上(可选地属于促销)。在促销结束时,它可能会被销毁,但我们希望保留商店和商品之间的链接,因此我们将取消
促销\u id

:dependent => :nullify

理想情况下,我们可以允许
StoreItem
有许多
促销
s,然后将日期时间存储在联接表上,这样我们就可以知道
StoreItem
何时处于促销状态,但这可能会使事情过于复杂。

通常,您会在数据库中将此类用户标记为非活动用户,清除这些用户数据非常困难,而且在UI中显示孤立数据也不是一种简单的方法。因为如果有更多的用户离开系统,它会变得更复杂。你是对的,我没有说这是一件好事,只是说它只在非常特定的用例中有用,当你不想跟踪谁做了什么,这是我通常避免自己做的事。。。例如,在我给你的例子中,假设我们只想知道正在调查项目的当前用户(如果有)。我知道这是一个旧线程,但另一个可能需要这样做的示例是将可计费项目添加到发票中。假设发票错误(用户错误),需要删除。您仍然希望为项目开具账单,这样您就不会希望删除这些项目,但您还需要知道这些项目尚未分配给发票。在这种情况下,您希望删除发票并取消分配该发票上的所有记录以添加到未来的发票。我有类似的情况。有些货物需要开发票。因此,我将发票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