0

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同じ投稿を想定して)同じ数のコメントを返すことはありません(複数のユーザーがコメントしていると想定)。

前のSO質問の回答から、ある種のネストされたhas_manyからまでが必要なようです。あれは正しいですか?Rails 3で「ソース」を検出する簡単な方法はありますか?

4

1 に答える 1

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はどこにありますか)

于 2012-06-03T22:42:01.113 に答える