私はArticle
モデルを持ってbelongs_to
いるuser
ので、ここでは以下のように特定の記事のユーザーを見つけています:
article = Article.find(params[:id])
user = User.find(article.user_id)
ご覧のとおり、2 つのクエリでこれを実現していますが、これを 1 つのクエリで実行したいだけです。何をお勧めしますか?tnx。
私はArticle
モデルを持ってbelongs_to
いるuser
ので、ここでは以下のように特定の記事のユーザーを見つけています:
article = Article.find(params[:id])
user = User.find(article.user_id)
ご覧のとおり、2 つのクエリでこれを実現していますが、これを 1 つのクエリで実行したいだけです。何をお勧めしますか?tnx。
article = Article.includes(:user).where(:id => params[:id]).first
申し訳ありません: 2 つのオブジェクトが必要な場合、Rails では 1 つのクエリでデータを選択する方法はありません。
Article
のデータを選択するとUser
同時に、ユーザー固有のデータを非 DB 属性に格納するクエリを作成できますArticle
。
article = Article.where(id: params[:id]).joins(:user).select('articles.title, users.name').first
puts article.attributes['name']
1 つのクエリですべてのデータを選択しますが、これでは Rails が台無しになります。User
インスタンスは取得できません。
はどうjoin
ですか?
user = User.joins(:articles).where(articles: {id: params[:id]}).first
これを試してください:-
article = Article.includes(:user).where("articles.id = ?", params[:id]).first
article.user のようなユーザーにアクセスできるようになり、他のクエリはトリガーされません。
これは熱心な読み込みとして知られています:-
詳細については、Rails ガイドを参照してください。
http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations
以下も参照してください。
http://railscasts.com/episodes/22-eager-loading
http://railscasts.com/episodes/22-eager-loading-revised