如何定义与多个不同模型之一的 'has_one style' 关联?

How to define a 'has_one style' association with one of a multiple different models?

有什么方法可以定义模型之间的 has_one 样式关联,其中关联可以与两个不同模型之一的实例关联?特别是,我有以下型号:

Post

评论

一个用户发表了post,其他用户可以发表评论。但用户也可以评论其他评论(如 Facebook 线程)。我试图通过说评论可以有目标(并且目标可以是 Post 或其他评论)来反映我项目中的这种关系。

我认为这最好通过 has_one 关联来完成,但据我所知,has_one 关联只能用于将一个模型与另一个模型相关联。

如何在这些模型之间实现 has_many(或其他类似格式的)关系?

你想要polymorphic belongs_to关系。 belongs_to 位于 Comment 模型正在执行的引用其他内容的一侧(具有 xx_id 列);考虑到 Post 会 has_many 评论,而 has_many 的反面是 belongs_to。 Polymorphic = 可以引用任何模型。

你很幸运,因为 Rails 很久以前就处理过这个问题。这是polymorphic associations的经典例子。您需要像这样定义模型:

class Post
  has_many :comments, as: :commentable
end

class Comment
  # fields :commentable_type, type: String
  # fields :commentable_id, type: Integer

  belongs_to :user

  belongs_to :commentable, polymorphic: true
  has_many :comments, as: :commentable
end

您将能够在两者上调用 comments,如:

post.comments

# And
post.comments.first.comments