假设我有一个User
模型has_many :posts
,而Post
has_many :comments
。
如果我@user.posts.map {|post| post.comments}.flatten
我会在用户的帖子上获得所有评论。是否有位置配置Post
或Comment
模型以检测它是否在特定用户的上下文中被引用,并且只返回特定用户的注释?
也就是说,@user.posts.map {|post| post.comments}.flatten
和@posts.map {|post| post.comments}.flatten
(假设相同的帖子)不会返回相同数量的评论(假设有多个用户正在评论)。
从previous SO question's answers,听起来我想要某种nested has_many through。那是对的吗?在Rails 3中有没有简单的方法来检测'源'?
答案 0 :(得分:1)
更新回答:
这是一个获得帖子作者评论的方法
class Post < ActiveRecord::Base
belongs_to :user # So, there's a user_id attribute
has_many :comments
def authors_comments
comments.where("user_id = ?", user_id)
end
end
那应该让你这样做:
@user.posts.each { |post| puts post, post.authors_comments }
但是,它不如其他方法有效; n 帖子将导致 n SQL查询以获取评论。但它非常接近下面评论中描述的内容。
原始答案(后代)
这不是最漂亮的,但你可以做类似
的事情class User < ActiveRecord::Base
has_many :posts # All the user's posts
has_many :comments # All the user's comments on all posts
# All comments made on any of user's posts
has_many :replies, :through => :posts, :source => :comments
def replies_to_self
replies.where("comments.user_id = ?", id)
end
end
致电@user.replies_to_self
以获取用户对自己帖子的评论
你最终得到这样的SQL:
SELECT
"comments".*
FROM
"comments"
INNER JOIN
"posts"
ON
"comments"."post_id" = "posts"."id"
WHERE
"posts"."user_id" = X AND "comments"."user_id" = X
(其中X
将是用户的ID)