ActiveRecord可以设置为自动限制二级关联吗?

时间:2012-06-03 21:28:58

标签: ruby-on-rails activerecord associations

假设我有一个User模型has_many :posts,而Post has_many :comments

如果我@user.posts.map {|post| post.comments}.flatten我会在用户的帖子上获得所有评论。是否有位置配置PostComment模型以检测它是否在特定用户的上下文中被引用,并且只返回特定用户的注释?

也就是说,@user.posts.map {|post| post.comments}.flatten@posts.map {|post| post.comments}.flatten(假设相同的帖子)不会返回相同数量的评论(假设有多个用户正在评论)。

previous SO question's answers,听起来我想要某种nested has_many through。那是对的吗?在Rails 3中有没有简单的方法来检测'源'?

1 个答案:

答案 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)