我想編寫一個查詢,結合兩個範圍與「OR」查詢(使用Rails 4,雖然問題仍然存在與rails 5)。ActiveRecord OR查詢與SQL中的兩個範圍,其中一個範圍有一個連接
型號1
scope :association_has_email, -> { joins(:model2).where.not(model2s:{email:nil}) }
scope :description_has_email, -> { where("description ~* ?", email_regex) }
(其中email_regex是一個正則表達式挑選出一個郵件)。
這給了我們SQL LIKE:
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)
創建範圍,挑選出這些機會,其中任一電子郵件是在聯想或在文本嵌入的電子郵件。
如何編寫一個「OR」查詢,其中一方需要連接而另一方不需要?
請參閱http://stackoverflow.com/questions/31096009/activerecord-or-query-hash-notation –
使用where-or gem(這是輝煌的......)你會得到一個「ArgumentError:傳遞給#or的關係必須在結構上兼容「 但是,如果您向範圍傳遞連接,則會出現問題,如果email_in_description根本不包含model2,則將其排除。 但是,我認爲我有一個解決方案。可以通過包括獲得一個外部連接... – Carpela
我總是建議人們使用原始SQL,其中ActiveRecord DSL無法成爲一個好工具。 – MurifoX