fet*_*tsh 2 ruby activerecord ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)
在用户页面上(http://host/users/1例如)我想显示给定用户评论过的所有帖子.然后每个帖子都会有所有其他评论.
我可以在我的用户控制器中执行以下操作:
def show
@user = User.find(params[:user_id])
@posts = []
user.comments.each {|comment| @posts << comment.post}
end
Run Code Online (Sandbox Code Playgroud)
这样我会找到用户,然后是他的所有评论,然后对每个评论发布相应的帖子,然后(在我看来)每个帖子我将呈现post.comments.我是Rails中的新手,所以我可以做到这一点=)但我认为它有点不好而且有更好的方法来做到这一点,也许我应该使用范围或named_scopes(不知道这是什么,但看起来害怕).
所以你能指出我在正确的方向吗?
您可以定义一个关联,该关联在单个查询中检索包含注释的所有帖子.将其保留在模型中可以降低控制器的复杂性,使您能够重用关联并使单元测试更容易.
class User < ActiveRecord::Base
has_many :posts_with_comments, :through => :comments, :source => :post
# ...
end
Run Code Online (Sandbox Code Playgroud)
:through是一个has_many指定连接表的选项,通过该连接表执行查询.我们需要指定:source为Rails无法推断源:post_with_comments.
最后,更新您的控制器以使用该关联.
def show
@user = User.find(params[:user_id])
@posts = @user.posts_with_comments
end
Run Code Online (Sandbox Code Playgroud)
要了解更多信息:through并:source查看文档.
| 归档时间: |
|
| 查看次数: |
1928 次 |
| 最近记录: |