具有多个条件的范围基于多个条件的条件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有多个条件的范围基于多个条件的条件相关的知识,希望对你有一定的参考价值。

是否有可能使用类似的东西

  scope :state, ->(state) {
    merge(where("start_time <= ? and end_time >= ?", Time.now.utc.beginning_of_day, Time.now.utc.beginning_of_day)) if state.include?("open")
    merge(where("end_time < ?", Time.now.utc.beginning_of_day)) if state.include?("closed")
    merge(where("start_time > ?", Time.now.utc.beginning_of_day)) if state.include?("upcoming")
  }

如果我使用此范围,则只有最后一个范围有效。

例如:

  • state([“coming”]) - >工作
  • state([“open”]) - >不使用的地方
  • state([“deleted”],[“coming”]) - >仅限使用即将到来的条件的地方
答案

希望这能解决你的问题。

scope :state, ->(state) {where(self.query_conditions(state), q: Time.now.utc.beginning_of_day))}

def self.query_conditions(state)
  q = ""
  q+= "start_time <= :q and end_time >= :q" if state.include?("open")
  q+= " and end_time < :q" if state.include?("closed")
  q+= " and start_time > :q" if state.include?("upcoming")
  q
end
另一答案

你应该可以使用

  scope :state, ->(state) {
    rel = all
    rel = rel.where("start_time <= ? and end_time >= ?", Time.now.utc.beginning_of_day, Time.now.utc.beginning_of_day) if state.include?("open")
    rel = rel.where("end_time < ?", Time.now.utc.beginning_of_day) if state.include?("closed")
    rel = rel.where("start_time > ?", Time.now.utc.beginning_of_day) if state.include?("upcoming")
    rel
  }

请注意,你应该这样做

state(["deleted", "upcoming"])

代替

state(["deleted"], ["upcoming"])

您也可以使用Array.wrap来简化范围的使用:

  scope :state, ->(state) {
    state = Array.wrap(state)
    rel = all
    rel = rel.where("start_time <= ? and end_time >= ?", Time.now.utc.beginning_of_day, Time.now.utc.beginning_of_day) if state.include?("open")
    rel = rel.where("end_time < ?", Time.now.utc.beginning_of_day) if state.include?("closed")
    rel = rel.where("start_time > ?", Time.now.utc.beginning_of_day) if state.include?("upcoming")
    rel
  }

在状态被包装的情况下,您可以通过以下两种方式使用范围:

Model.state(['open', 'upcoming'])
Model.state('open', 'upcoming')

以上是关于具有多个条件的范围基于多个条件的条件的主要内容,如果未能解决你的问题,请参考以下文章

Bash for 具有多个条件的循环

R:基于自定义距离函数和多个条件快速匹配记录

在具有分页的单个模型查询代码点火器中获取具有多个条件的多个连接结果

具有多个条件的python imaplib搜索

MYSQL IN 或多个条件

如何合并两个或多个具有不同 where 条件的查询?我必须重用在第一个代码中使用的代码