【问题标题】: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_time 和end_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_time 和 end_time 时添加 where 条件