Rails 4链条件的范围和或

时间:2016-01-01 13:58:25

标签: ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

rails 4中的语法不断发展,但不清楚如何适应多种条件,尤其是范围。所以

Circuit.where(origin_lon: (@lng_min.to_f..@lng_max.to_f), origin_lat: (@lat_min.to_f..@lat_max.to_f))

使用逗号进行AND查询。但是,如果要添加另一个AND子句,该子句由两个OR条件组成,the api QueryMethods instructions do not clear up如何写这个:

Circuit.where(origin_lon: (@lng_min.to_f..@lng_max.to_f), origin_lat: (@lat_min.to_f..@lat_max.to_f), ('when_start >= ? OR when_end <= ?', @earliest_start, @latest_start) )

导致语法错误

1 个答案:

答案 0 :(得分:1)

您无法将SQL样式where条件与纯红宝石where条件混合使用。您需要拆分where

Circuit.where(origin_lon: @lng_min.to_f..@lng_max.to_f, origin_lat: @lat_min.to_f..@lat_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)