如何实现引用用户的多态关系?

时间:2012-09-03 19:29:34

标签: ruby-on-rails ruby model polymorphism

首先,我有一个多态关联设置,因为注释可以属于任何对象(在我的帖子和文章中)。

我希望能够说:

u = user.first
u.comments #This will list all comments from a user
u.comments.where(:commentable_type => "Post")  

以上这行不起作用。它生成一个sql:     SELECT“comments”。* FROM“comments”WHERE“comments”。“commentable_id”= 1 AND“comments”。“commentable_type”='用户'和“评论”。“commentable_type”='发布'

显然这会返回一个空列表,因为注释不能属于2种类型。我也希望能够说:

f = Food.first
f.comments.first.user #give me the user that posted the first comment

这是我的基本模型......有关更改此内容的任何提示吗?

class Comment < ActiveRecord::Base
  belongs_to :commentable, :polymorphic => true
end

class Post < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class Article < ActiveRecord::Base
  has_many :comments, :as => :commentable
end

class User < ActiveRecord::Base
    has_many :comments, :as => :commentable
end

2 个答案:

答案 0 :(得分:4)

我认为您应该查看您的评论模型,它应该如下所示:

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :commentable, :polymorphic => true
end

所以你有两个关系,第一个将指向发布评论的人,另一个将指向被评论的对象。

Comment.first.user # this will return the user

Comment.first.commentable # this will return the object which the comment was attached (Post, Article or ?Food?)

如果您想尝试这种方法,请不要忘记迁移。

答案 1 :(得分:0)

您应该能够执行以下操作来实现您的目标:

u.comments.map { |cmt| Post.find(cmt.commentable) }

同样适用于文章。这将返回一系列帖子或文章。如果它们不存在则会出错,所以你必须为此修改它。

我不完全理解你的第二个问题。如果f.comments.first只返回一条评论,则.user应该返回该评论的用户,假设您正确设置了用户和评论类(用户has_many评论/评论belongs_to用户,如Alexandre Abreu指出的那样) out),但也许我误解了你的问题。