检索给定用户评论的所有帖子,Ruby on Rails

时间:2010-10-23 13:20:57

标签: ruby-on-rails ruby activerecord associations

我有用户,帖子和评论。用户只能在每个帖子上发布一条评论。

class User < ActiveRecord::Base
  has_many :posts
  has_many :comments
end

class Post < ActiveRecord::Base
  has_many :comments
  belongs_to :user
end

class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :post
end

在用户页面上(例如http://host/users/1)我想显示给定用户评论过的所有帖子。然后每个帖子都会有所有其他评论。

我可以在用户控制器中执行以下操作:

def show
  @user = User.find(params[:user_id])
  @posts = []
  user.comments.each {|comment| @posts << comment.post}
end

这样我会找到用户,然后是他的所有评论,然后对每个评论发布相应的帖子,然后(在我看来)每个帖子我将呈现post.comments。我是Rails中的新手,所以我可以做到这一点=)但我认为它有点不好而且有更好的方法来做到这一点,也许我应该使用范围或named_scopes(不知道这是什么,但看起来吓人)。

那么你能指出我在正确的方向吗?

2 个答案:

答案 0 :(得分:5)

您可以定义一个关联,该关联在单个查询中检索包含注释的所有帖子。将其保留在模型中可以降低控制器的复杂性,使您能够重用关联并使单元测试更容易。

class User < ActiveRecord::Base
  has_many :posts_with_comments, :through => :comments, :source => :post
  # ...
end

:throughhas_many选项,用于指定用于执行查询的连接表。我们需要指定:source,因为Rails无法从:post_with_comments推断出来源。

最后,更新您的控制器以使用该关联。

def show
  @user  = User.find(params[:user_id])
  @posts = @user.posts_with_comments
end

要了解有关:through:source的更多信息,请查看documentation

答案 1 :(得分:0)

当你收到用户时,你就有他的帖子的关联,每个帖子都有他的评论。 你可以写: (我不知道你的表字段的名称,所以我命名了文本文本)

# In Controller
@user = User.find(params[:user_id]).include([:posts, :comments])

# In View
@user.posts.each do |post|
  post.text
  # Comments to the Post
  post.comments.each do |comment|
    comment.text
  end
end

我没有测试过代码,因此可能会出现一些错误。