「OR」クエリを2つのスコープに組み合わせたクエリを作成したいとします(Rails 4を使用していますが、ActiveRecordまたは1つのスコープが1つのスコープに結合されている2つのスコープを持つクエリ
MODEL1
scope :association_has_email, -> { joins(:model2).where.not(model2s:{email:nil}) }
scope :description_has_email, -> { where("description ~* ?", email_regex) }
(email_regexが電子メールを選び出す正規表現です)。
SELECT \"model1s\".* FROM \"model1s\" WHERE (description ~* '[[:<:]][A-Z0-9._%+-][email protected][A-Z0-9.-]+.[A-Z]{2,4}[[:>:]]')
SELECT \"model1s\".* FROM \"model1s\" INNER JOIN \"model2s\" ON \"model2s\".\"id\" = \"model1s\".\"model2_id\" WHERE (\"model2s\".\"email\" IS NOT NULL)
を電子メールは、テキストでの会合または埋め込まれた電子メールの中にあるいずれかのこれらの機会を選び出すためのスコープを作成します。私たちはようなSQL与え
。
片方が結合を必要とし、もう一方が結合しない "OR"クエリをどのように記述しますか?
参照してください。http://stackoverflow.com/questions/31096009/activerecord-or-query-hash-notation –
where-or gem(華麗です...)では、 "ArgumentError:Relationが#またはに渡されます構造的に互換性がなければなりません " しかし、スコープにジョインを渡すと、email_in_descriptionにmodel2がまったくない場合は除外されます。 しかし、私には解決策があると思います。外部結合を取得するためにインクルードすることができます... – Carpela
ActiveRecord DSLが素晴らしいツールではないところで、生のSQLを使用することを常に提案します。 – MurifoX