【问题标题】:How to check if params present in scope rails如何检查范围轨道中是否存在参数
【发布时间】:2018-03-16 07:10:16
【问题描述】:
scope :created_after, ->(start_time,end_time) { where("start_time > ? and end_time <?", start_time,end_time) }

如果开始时间存在,我想添加 if 条件,那么只有 start_time 查询运行如果 end_time 然后它的查询运行

【问题讨论】:

    标签: ruby-on-rails activerecord scope


    【解决方案1】:

    我认为created_between 更适合您想对created_after 范围执行的操作。

    您可以使用start_timeend_time 列创建两个辅助范围来过滤结果。

    scope :created_after, ->(start_time) do
      where("start_time > ?", start_time)
    end
    
    scope :created_before, ->(end_time) do
      where("end_time < ?", end_time)
    end
    

    然后你可以按照你想要的方式组合它们:

    scope :created_between, ->(start_time, end_time) do
      query = self.all
      query = query.created_after(start_time) if start_time
      query = query.created_before(end_time)  if end_time
      query
    end
    

    如果您对任何范围参数执行提供nil 的查询,它将忽略它们。例如:created_between(nil, nil) 将不会产生额外的查询。

    【讨论】:

      【解决方案2】:

      你可以把它链接在条件中

      scope :created_after, ->(start_time, end_time) { start_time && end_time && where("start_time > ? and end_time <?", start_time, end_time) }
      

      这将仅在存在 start_timeend_time 时添加 where 条件

      【讨论】:

        猜你喜欢
        • 2014-10-18
        • 1970-01-01
        • 2011-06-29
        • 1970-01-01
        • 2014-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        相关资源
        最近更新 更多