我总是发现围绕多态关联的文档不清楚。例如,来自The Rails Guide:
对于多态关联,模型可以属于单个关联上的多个其他模型。
我发现我有很多案例,其中模型属于多个其他模型。例如,如果我有公司模型,发票模型和AccountPayable模型,我发现我可以做到:
class Company < ActiveRecord::Base
has_many :invoices
has_many :account_payables
end
# not shown: Invoice and AccountPayable classes
# with corresponding belongs_to associations
这似乎总能正常工作。虽然正如我所说,当我阅读多态的帮助时,我觉得我应该将它用于上述情况。
但后来我认为这不可能是正确的。如果我上面的简单示例是多态的,那么这意味着模型只能由另一个模型“使用”,除非你进行多态化。这感觉过于严格。此外,多态接口名称示例往往是动词(例如“可评论”等)。如何将上面的例子变成动词? Companyable?
也许文档试图告诉我它是什么时候模型实例只能属于一个关联的实体而不是更多。例如,如果公司只能属于发票或 AP(不是两者)。如果是这种情况,在我看来它更像是单表继承而不是普通的旧的has_many / belongs_to。使用STI,我可以拥有class Creditor < Company...
和class Debtor < Company...
,并分别与Invoices和AccountPayables相关联。在我上面的例子中,可以想象一个给定的公司是我开具发票并且还欠钱的人(即AccountPayable)
感谢您的任何澄清......
答案 0 :(得分:0)
你说:
我发现我的模型很多 belongs_to多个其他模型。 例如,如果我有公司模型, 发票模型和AccountPayable 模型,我发现我可以做到:
但是你给出的例子实际上是一个模型“has_many”到多个其他模型。
带有belongs_to的模型意味着它必须指定外键,如果它属于多个模型,那么您如何知道foreign_key所指的模型?多态关联帮助您解决这个问题。
上面给出的示例绝对没问题,并且不需要多态关联。
答案 1 :(得分:0)
你的问题相当令人困惑,我认为你的模型不应该是多态的。
需要多态的场景示例。
(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