【问题标题】:ActiveRecord: when is it polymorphicActiveRecord:什么时候是多态的
【发布时间】:2011-01-18 11:11:53
【问题描述】:

我一直发现有关多态关联的文档不清楚。比如来自The Rails Guide

使用多态关联,一个模型可以在一个关联上属于多个其他模型。

我发现在很多情况下,模型都属于多个模型。例如,如果我有一个 Company 模型、一个 Invoice 模型和一个 AccountPayable 模型,我发现我可以这样做:

class Company < ActiveRecord::Base
   has_many :invoices
   has_many :account_payables
end
# not shown: Invoice and AccountPayable classes 
# with corresponding belongs_to associations

这似乎总是很好。虽然正如我所说,当我阅读多态的帮助时,我觉得我应该将它用于上述情况。

但是我认为那是不对的。如果我上面的简单示例是多态的,那么这意味着一个模型只能被另一个模型“使用”,除非你去多态。这感觉过于严格。此外,多态接口名称示例往往是动词(例如“commentable”等)。如何将上面的示例变成动词?适合吗?

也许文档试图告诉我,当模型实例只能属于关联实体之一而不再属于其他实体时。例如,如果一家公司只能属于 Invoices AP(不能同时属于两者)。如果是这种情况,在我看来,它更像是单表继承,而不是普通的旧 has_many/belongs_to。使用 STI,我可以拥有 class Creditor &lt; Company...class Debtor &lt; Company... 并将它们分别与 Invoices 和 AccountPayables 相关联。在我上面的例子中,可以想象给定的公司是我开具发票并且欠钱的人(即 AccountPayable)

感谢您的澄清......

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    你说:

    我发现我有很多情况下,模型 属于多个其他模型。 例如,如果我有一个公司模型, 一个 Invoice 模型和一个 AccountPayable 模型,我发现我可以简单地做到:

    但您给出的示例实际上是一个模型,它对多个其他模型“有很多”。

    带有belongs_to的模型意味着它必须指定外键,如果它属于多个模型,那么你怎么知道foreign_key指的是哪个模型?正是这个问题,多态关联帮你解决了。

    您上面给出的示例绝对可以,并且不需要多态关联。

    【讨论】:

    • 你找到了我困惑的根源。谢谢!
    【解决方案2】:

    你的问题相当混乱,我认为你的模型不应该是多态的。

    需要多态性的场景示例。

    (articles.rb) has_many article_comments
    (photos.rb)  has_many photo_comments
    (article_comments.rb) has_many article_comment_comments
    (photo_comments.rb) has_many photo_comment_comments # repeat for comments on commments', comments etc.
    
    v
    
    (articles.rb) has_many comments, :as => commentable
    (photos.rb) has_many comments, :as => commentable
    (comments.rb) has_many comments, :as => commentable
    

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 2012-10-31
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多