1

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

我想能够说:

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" = 'User' AND "comments"."commentable_type" = 'Post'

显然这将返回一个空列表,因为评论不能属于 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
4

2 回答 2

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?)

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

于 2012-09-03T20:11:18.907 回答
0

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

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

同样适用于文章。这将返回一组帖子或文章。如果它们不存在,它将给出错误,因此您必须为此进行修改。

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

于 2012-09-03T20:24:56.347 回答