or
methodは、同様のフィルタパターンを持つ別のリレーションを取り、呼び出されているオブジェクトの既存のフィルタと組み合わせます。
たとえば、Parent.status1.or(Parent.status2)
は、status: 1
またはstatus: 2
のいずれかのレコードセットを提供します。
(場合、誰かが、問題の例はまた、enum
を使用し、それに慣れていない値の名前を使用して、列挙型の属性値をフィルタリングすることを可能にする。この場合#status1
と#status2
それぞれ{ status: 0 }
と{status: 1}
に対応。)
最終結果を変更するために、より関係のメソッドを呼び出すためには、あなたはこのように、#or
を呼び出した結果にをそれらを呼び出す必要があります。
Parent.status1.or(Parent.status2).includes(:children).where(children: {name: 'ABC'})
はあなたのコメントに基づいて、私はあなたがどちらか(status1
を持つ)レコードをしたいか(status2
を持っているとのマッチングchildren
記録を持っている)ということになりまし参照してください。 where
での関係を使用するために(のようなwhere(children: { name: value })
あなたがjoins(:children).where(children: { name: value })
(関連テーブルとに加入しなければならないということ。ActiveRecordのはあなただけincludes
を使用する場合は参加推測だろうと思われるが、それは限り文書化されていませんです
注意。私はor
に互換性がないとして、2つの関係を見ている理由です言うことができるように:他にはないながら一つは、参照リスト内children
を持って
を文字列として手でwhere
句を記述する場合、それは変更されません。参照リスト、したがってor
は、その関係を互換性がないと見なしません。手でwhere
句を書き、あなたは明示的使用joins
する必要があります。
Parent.status1.joins(:children).or(Parent.status2.joins(:children).where("children.name = 'ABC'"))
私はそれを得ました。あなたの助言をありがとう! –
私がしたいのは、データ "status1 OR(status2 AND childrens.name = ABC)"を取得することです。 最後に、次のコードで試しました。 'st1_ids = Parent.status1.pluck(:ID)' ' st2_and_name_is_abc_ids = Parent.status2.pluck(:ID)' ' conbination = Parent.where(ID:st1_ids + st2_and_name_is_abc_ids)' –
私はあなたの質問を誤解しました。私は私の答えを更新しました。より効果的な質問を書く方法について[この記事](http://stackoverflow.com/help/how-to-ask)を提案できますか?あなたが期待したものの詳細なリストを含んでいれば、より迅速な回答が得られたはずです。 –