获取特定类型的多态关联

时间:2019-05-05 14:13:46

标签: ruby-on-rails polymorphism ruby-on-rails-5 polymorphic-associations

我有这个模特

class Article
  belongs_to :source, polymorphic: true
  belongs_to :html, foreign_type: "Html", foreign_key: "source_id"
  belongs_to :pdf, foreign_type: "Pdf", foreign_key: "source_id"
end

当我设置带有html源的文章时,当html和pdf具有相同的ID时仍会找到pdf

html.id
=> 1
pdf.id
=> 1

article = Article.create!(source: html)
article.pdf.id
=> 1

我在做什么错? foreign_type不会告诉Rails多态关联要匹配什么吗?

1 个答案:

答案 0 :(得分:1)

根据APIdock:

  

:foreign_type

     

如果这是多态关联,则指定用于存储关联对象类型的列。默认情况下,这被认为是   带有“ _type”后缀的关联的名称。所以一堂课   定义一个longate_to:taggable,多态的:真正的关联将使用   默认为“ taggable_type”:foreign_type。

因此,您应该在foreign_type关联中使用source来指定存储关联对象类型的列。

我认为您需要两种方法htmlpdf,因此当源为HtmlPdf时可以使用它。在这种情况下,我认为您应该为其创建两个方法,例如:

def html
  source if source_type == "Html"
end


def pdf
  source if source_type == "Pdf"
end