2010-10-23 116 views
2

我有用户,帖子和评论。用户只能向每个帖子发布一条评论。检索给定用户评论的所有帖子,Ruby on Rails

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 

在userpage(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(不知道这是什么,但看起来像害怕)。

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

回答

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

+0

我不得不承认,我第一次读这本书时迷路了,因为我的思想还停留在“用户 - >帖子 - >评论”的关系上。但是,经过几次审查之后,我对'用户 - >评论 - >帖子'心智模型进行了调整。评论看起来像一个经典的多对多映射模型,然后这一切似乎都很简单! – 2010-10-23 14:09:56

+0

哇!它效果很好。比我想象的更容易。谢谢。 – fetsh 2010-10-23 14:17:18

+0

@爱德华你在指甲上。 'has_many:through =>'与has_and_belongs_to_many'或多或少相同,只是'has_many:through =>'可以让你处理连接关联。这就是常见的用例,尽管它对@ilzoff所做的也很完美。 – 2010-10-23 14:21:47

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 

我没有测试的代码,所以可能会有一些错误。

+0

这不完全是我想要的。我不是需要所有用户的帖子,而是通过用户评论的所有帖子。你可以看到,泰特约翰逊的答案,它适用于我。 – fetsh 2010-10-23 14:21:53

相关问题