【问题标题】:Rails 4 chain conditions with ranges and orRails 4链条件与范围和或
【发布时间】:2016-01-01 13:58:24
【问题描述】:

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 查询。但是,如果要添加另一个由两个OR 条件组成的AND 子句,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) )

导致语法错误

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    • 好的。 .where[...].where 消除了一些混乱......如果第二个 where 语句是一个范围的 ÒR 怎么办?
    • 您可以使用类似 SQL 的语法将所有内容合并到一个 where 中。
    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2015-02-14
    • 2017-06-25
    • 2016-07-23
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多