2012-03-03 6 views
1

動的条件を使用して熱心な負荷を実行することは可能ですか?具体的には:それはいうだけ:itemsよりも全体のクエリにwhere条件が適用されますが、達成するための方法があるようダイナミック条件付き熱負荷

u_id = params[:user_id] 
Container.includes(:items).where("items.user_id =?", u_id) 

これは明らかに私に特定のuser_idの項目だけでなく、すべてのコンテナを与えるものではありませんこれはARelを使用して、またはカスタムSQLクエリが必要ですか?

答えて

0

ちょうどあなたのクエリにscopedを呼び出す:

Container.where("items.user_id =?", u_id).includes(:items).scoped 

これはARELオブジェクトではなく、データベースのクエリを返します。

Rails Consoleで試してみてください。scopedを付けずに実行した場合と比較して作成されたArelオブジェクトが表示されます。

+0

これにより、スコープの理解が深まります。現在、クエリはアイテムを含むコンテナのみを返します。与えられたユーザーのために熱心な負荷アイテムを作成し、アイテムが含まれていなくてもすべてのコンテナを取得できますか? – Stefan

+0

コンテナにuser_idがあった場合は比較的簡単です。 include(:items).scoped'これは、指定されたユーザのすべてのコンテナを選択し、次に、選択されたコンテナに関連するアイテムを含めることになります。あなたがコンテナに 'user_id'を持っていなかったなら、私は私の頭の上に答えを持っていません。私が何かを見つけたら、私はそれを投稿します。 – nmott

+0

助けてくれてありがとう。私はデザインを修正しようとします、おそらくそれが私の難しさの原因です。現在、すべての 'Users'はすべての' Containers'を取得できますが、それらの 'Items'はそれらのコンテナ内で取得できます。私はそれを少し論理的に見ていますが、それは楽しいN + 1クエリーの問題を引き起こしています。 – Stefan