2016-01-01 82 views
0

軌道4中的語法不斷髮展,但不清楚如何適應多個條件,特別是對於範圍。所以Rails 4鏈條件,範圍和或

Circuit.where(origin_lon: (@[email protected]_max.to_f), origin_lat: (@[email protected]_max.to_f)) 

用它的逗號,做一個AND查詢。但是,如果一個人想添加它是由兩個OR條件另一個AND條款,the api QueryMethods instructions do not clear up該怎麼寫:

Circuit.where(origin_lon: (@[email protected]_max.to_f), origin_lat: (@[email protected]_max.to_f), ('when_start >= ? OR when_end <= ?', @earliest_start, @latest_start)) 

導致語法錯誤

回答

1

不能混合SQL風格where條件與純紅寶石where條件。您需要拆分where

Circuit.where(origin_lon: @[email protected]_max.to_f, origin_lat: @[email protected]_max.to_f).where('when_start >= ? OR when_end <= ?', @earliest_start, @latest_start) 

您也可以使用範圍來清理一點點的語法和使代碼的可重用性

class Circuit < ActiveRecord::Base 
    scope :longitude, ->(min, max) { where(origin_lon: min.to_f..max.to_f) } 
    scope :latitude, ->(min, max) { where(origin_lat: min.to_f..max.to_f) } 
end 

Circuit.longitude(@lng_min, @lng_max).latitude(@lat_min, @lat_max).where('when_start >= ? OR when_end <= ?', @earliest_start, @latest_start) 
+0

確定。其中'清除了一些混淆......如果第二個陳述是範圍內的一個「R」怎麼辦? – Jerome

+0

您可以使用類似SQL的語法將所有內容合併到一個'where'中。 –