モデルに関連付けられている列だけでなく、2つのテーブルを結合してすべての列を返そうとしています。
私はそのようなものを持っています:
Comment.joins(:user).select("*")
SQLは問題ないように見えますが、それでも、コメントのみが返され、それに関連付けられているユーザー情報は返されません。
*
だけでなく、どうすれば取得できますcomments.*
か?
モデルに関連付けられている列だけでなく、2つのテーブルを結合してすべての列を返そうとしています。
私はそのようなものを持っています:
Comment.joins(:user).select("*")
SQLは問題ないように見えますが、それでも、コメントのみが返され、それに関連付けられているユーザー情報は返されません。
*
だけでなく、どうすれば取得できますcomments.*
か?
どうですか
comments = Comment.includes(:user).all
これで配列になりますcomments
ので、すべてのユーザーを表示するには、配列をループする必要があります。
#won't work
comments.user
#should work
comments[0].user
comments.each do |comment|
puts comment.user.name #or whatever
end
これは機能するはずです:
comments = Comment.joins(:user).includes(:user)
しかし、これが起こっていると私が思うことです。コンソールウィンドウで出力を表示している場合、コンソール出力は返されたルートレベルのオブジェクトのみを反映/検査すると思います。
上記のコードを実行した実験をしました。端末出力は、コメントをフェッチしたことを記録しましたが、関連するユーザーについては言及していませんでした。次に、データベースに対して2番目のクエリを実行できないようにデータベースをシャットダウンしてから、関連付けられたユーザーを要求します。
comments.user
コンソールはユーザーを出力します。これは、データベース接続が試行されなかったため、ユーザーがすでに熱心にロードされていることを示しています。
Comment.select('*')。includes(:user)
Ryan Batesは、このテーマに関する優れたチュートリアルを持っています。
http://railscasts.com/episodes/22-eager-loading-revised?autoplay=true