2017-02-05 4 views
0
class Parent < ApplicationRecord 
    has_many :children 

    enum status: { 
    status1: 0, 
    status2: 1  
    } 
end 

class Child < ApplicationRecord 
    belongs_to :parent 
end 

# error 
# "Relation passed to #or must be structurally compatible. Incompatible values: [:references]" 
combination = Parent.status1.or(Parent.status2.includes(:children).where(children: {name: 'ABC'})) 

「status1」または「status2に「ABC」という名前の子がありますが、エラーが発生します。【Rails5】ActiveRecordの "OR"クエリを "includes"でどのように使うことができますか?

答えて

2

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'")) 
+0

私はそれを得ました。あなたの助言をありがとう! –

+0

私がしたいのは、データ "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)' –

+0

私はあなたの質問を誤解しました。私は私の答えを更新しました。より効果的な質問を書く方法について[この記事](http://stackoverflow.com/help/how-to-ask)を提案できますか?あなたが期待したものの詳細なリストを含んでいれば、より迅速な回答が得られたはずです。 –

0

あなたが呼び出しされていません「が含まれる」最終または結果に。

parent = Parent.status1.or(Parent.status2) 
parent.includes(:chilren).where(children: {name: "ABC"}) 
関連する問題