Ruby on rails RoR:在这个场景中,我应该使用“属于”、:多态性吗?

Ruby on rails RoR:在这个场景中,我应该使用“属于”、:多态性吗?,ruby-on-rails,activerecord,polymorphic-associations,has-one,Ruby On Rails,Activerecord,Polymorphic Associations,Has One,我正在从事一个项目,在这个项目中,许多ActiveRecord模型都可以与之进行对话。用户可以讨论网站的方方面面。关于如何实施这一点,我有两个想法 1) 在资产中使用所属对象,而不是会话-会话将完全不知道其资产 class Product< ActiveRecord::Base belongs_to :conversation end class PurchaseOrder < ActiveRecord::Base belongs_to :conversation end

我正在从事一个项目,在这个项目中,许多ActiveRecord模型都可以与之进行对话。用户可以讨论网站的方方面面。关于如何实施这一点,我有两个想法

1) 在资产中使用所属对象,而不是会话-会话将完全不知道其资产

class Product< ActiveRecord::Base
  belongs_to :conversation
end

class PurchaseOrder < ActiveRecord::Base
  belongs_to :conversation
end
类产品
2) 在对话中使用一个belown_to,:多态=>true

class Conversation < ActiveRecord::Base
  belongs_to :asset, :polymorphic => true
end

class Product < ActiveRecord::Base
  has_one :conversation, :as => :asset
end

class PurchaseOrder < ActiveRecord::Base
  has_one :conversation, :as => :asset
end
类对话true
结束
类产品:asset
结束
类PurchaseOrder:asset
结束

建立这种关系模型的正确方法是什么?如果我要说明这种关系,我会说“一个产品/采购订单可能有一次对话”。

我认为这取决于关系中的一个模型需要了解另一个模型的内容。在我看来,从你的描述来看,第二种方法更适合这种情况。为什么?

  • Product
    PurchaseOrder
    模型是自我约束的实体,从某种意义上说,它们可以存在于关于它们的对话之外。因此,您可能不希望外键污染这些用于附加对话的模型。从这个意义上说,这种关系应该是不引人注目的
  • 一个
    对话
    在逻辑上依赖于它所关联的实体,因此它有
    资产id
    (和
    资产类型
    )外键,这可能是合理的

这是一个非常常见的问题,也是一个经常让我停下来思考的问题。这并不总是显而易见的。有一篇关于这个问题的好文章

回答得很好。谢谢你的洞察力。