回答
我不知道的輔助方法,但你可以always drop down to (almost) pure SQL:
Client.where("orders_count = ? AND locked = ?", params[:orders], false)
我會把這一切都在一個地方塊。例如,下面是基於類似的複雜「其中」第一個「範圍」:
class Foo < ActiveRecord::Base
def self.my_complex_where(args)
where("(col1 = ? AND col2 = ?) OR (col3 = ? AND col4 = ?)",
args[:val1], args[:val2], args[:val3], args[:val4])
end
end
或者,你使用這個符號可以做到這一點:
class Foo < ActiveRecord::Base
def self.my_complex_where(args)
where("(col1 = :val1 AND col2 = :val2) OR (col3 = :val3 AND col4 = :val4)",
:val1 => args[:val1],
:val2 => args[:val2],
:val3 => args[:val3],
:val4 => args[:val4])
end
end
除了已經給出了答案,你可能也想看看寶石 ''
例子:
Person.where{(name =~ 'Ernie%') & (salary < 50000) | (name =~ 'Joe%') & (salary > 100000)}
鏈接的squeel已損壞。 請參閱https://rubygems.org/gems/squeel – kuboon
您需要下降到更原始AREL
t = Model.arel_table
a = (t[:a].eq(nil).and(t[:b].eq(nil)))
b = (t[:a].not_eq(nil).and(t[:b].not_eq(nil)))
Model.where(a.and(b))
這並不反映所要求的邏輯 –
良好的捕獲,將upvote你的。這就是我在同一時間回答2個類似問題的結果。 –
小李的答案基本上是你在找什麼
class Model < ActiveRecord::Base
def self.this_or_that(a1, a2, a3, a4)
t = Model.arel_table
q1 = t[:a].eq(a1).and(t[:b].eq(a2))
q2 = t[:c].eq(a3).and(t[:d].eq(a4))
where(q1.or(q2))
end
end
一些slides我放在一起的阿雷爾
通過使用t.grouping選項,我能夠使其工作(在v4.0.1中)。在上面的示例中,我仍然得到(a和b或c和d)。第12頁上的幻燈片具有按預期工作的分組語法((a和b)或(c和d))。 – NotDan
- 1. Python如果這個和這個和這個
- 2. jQuery這個和這些
- 3. Javascript和這個?
- 4. JavaScript和這個
- 5. jQuery.ready和這個
- 6. this()和這個
- 7. 使這個$(這個)工作
- 8. addEventListener和這個的範圍
- 9. 升壓shared_ptr的和「這個」
- 10. 這個之間的區別。和這個 - >
- 11. 這個Integer和這個List之間的冒號是什麼?
- 12. Android和使這個按鈕之一的這個監聽器
- 13. 這個和這個@入口的區別是什麼?
- 14. IQueryable在哪裏迭代(這個或這個或這個)
- 15. jQuery的:$(這)對這個$()
- 16. 這個
- 17. 這個
- 18. 這個
- 19. 這個
- 20. MySQL查詢 - 不等於這個和這個
- 21. 在Ember中,這個和這個控制器有什麼區別
- 22. 使這個f.autocomplete_field和這個標籤模型一起工作?
- 23. 如何優化這個數據庫和這個查詢?
- 24. 爲什麼這個版本和這個版本一樣?
- 25. Javascript綁定和這個
- 26. LINQ表達式和這個
- 27. Javascript回調和「這個」
- 28. Cocos2d-html5和socket.io這個undefined
- 29. shared_ptr和這個指針
- 30. initSql財產和DriverManagerDataSource這個
這是不是最好的Arel解決方案,因爲您仍然需要編寫SQL。 – rxgx
它甚至不是一個arel解決方案 –