2016-06-28 16 views
0

user_idおよびcomment_idのような関連IDの代わりに、関連付けを使用してすべての関連レコードを取得する方法を理解できません。今、私はそれらのそれぞれにこれらのコメントを取得したいと思いますアソシエーションを使用してすべての関連レコードを取得

@user = User.find_by_id(params[:id]) 
@comments = @user.comments 

: は、私は三つのモデルUser, Post, Comment, Imageや団体が

User 
    has_many :posts 
    has_many :comments 

Post 
    belongs_to :user 
    has_many :comments 
    has_many :images 

Comment 
    belongs_to :user 
    belongs_to :post 

Image 
    belongs_to :post 

ている今、私は、ユーザーのuser_idを持っているとして、ユーザーを見つけることがあるとしましょう彼らのポストの関連する記録。私はすべてのコメントに対応するpost_idの代わりに投稿ハッシュをしたい。 これを1回のクエリで実行します。 ご意見がありましたら、私にお尋ねください。

+0

は '@のuser.comments.first.post'を試してみて、それが' POST'インスタンスを返します。このアプローチの中で[N + 1 query'](https://www.sitepoint.com/silver-bullet-n1-problem/)の問題に気をつけてください。これはあなたの質問の範囲外です。 – mudasobwa

+0

ご心配ありがとう@mudasobwa。しかし私の質問は、post_idの代わりに各コメントに対応する投稿記録を既に持っているコメント収集をしたいということです。私はそれぞれの投稿を得るためにループを作りたいとは思わない –

答えて

2

使用includes(:association)

@user = User.find_by_id(params[:id]) 
@comments = @user.comments.includes(:post) 

注:これは、別の(第2)の問合せを行います。また

、あなたの最初のクエリでそれを含める:

@user = User.where(id: params[:id]).includes(comments: :post) 
+0

申し訳ありません@Uzbekjon、これは、名前が 'posts'の関連付けのエラーがコメントに見つかりませんでした。 –

+0

それはタイプミスです。 'belongs_to'関連であるため、' post'に変更してください。 – Uzbekjon

+0

okay @Uzbekjon。これはcommentsコレクションのpost_idを置き換えません。これは完全なポストハッシュの代わりにpost_idを再度返します。 –

関連する問題