2017-03-17 3 views
1

アクティブなレコードのグループを選択する.whereクエリを実行しました。これらのレコードのそれぞれには.items関連があり、関連する各アイテムにはtheme_idがあります。とにかく、私は初期配列のあらゆる部分や明示的なループのようなことをせずに、theme_idが0の関連項目を持つレコードだけをフィルタリングできますか?良いことを示すためにその後のアクティブレコードクエリフィルタ

は[P_0、...、P_N]私は.whereフィルタ 後に何を得るのpのそれぞれは [I_0、...、値In]の関連する配列を持っていそれぞれ私はtheme_idを持っています。私はtheme_idが0のアイテムを持っているpだけを取得したいと思っています。

答えて

0

あなたのコードベースは分かりませんので、暗闇の中でスタブですが、予約しても同じ配列を得ることはできませんでしたロジックは少しですか?

ary = Item.where(theme_id: 0).map {|i| i.association_you_want } 
0

joinsでこれを達成できます。例えば。

MyRecord.joins(:items).where("items.theme_id" => 0).distinct 

二つのアイテムを持つレコードがそうでなければ結果に二回も含まれますのでdistinctが、必要です。これは、データベース結合の仕組みの奇抜です。

0

ActiveRecord whereは、関連付け(およびそれらの関連付けの関連付け)を指定できる「ハッシュ構文」を採用しています。 joinswhereの間のやり取りはちょっと面白く、joinsがテーブル名を望んでおり、whereがアソシエーション名をとっています。これらのハッシュ構文where条件は、必要なだけ深くネストすることができます。

私の経験では、文字列条件を使用するのではなく、可能であればハッシュ構文を使用する方がよいでしょう。

.joins(:items).where(items: {theme_id: 0}) 
+1

このコードスニペットは、(http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)[説明を含む]、疑問を解決するかもしれないが、本当に改善するのに役立ちますあなたの投稿の質。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – DimaSan