【问题标题】:In Rails 5, how do I write a finder "OR" query to say exlucde from a list or be nil?在 Rails 5 中,如何编写查找器“OR”查询来表示从列表中排除或为零?
【发布时间】:2020-05-01 18:38:49
【问题描述】:

我想编写一个 Rails 5 finder 查询,如果字段不属于某个值集或为空,则返回对象。我尝试了以下

Order
.joins(...joins1...)
.joins(...joins2...)
.left_outer_joins(:customer => :program)
      .where.not(
        :programs => { :number => excluded_numbers }
      ).or(:programs => { :number => nil})
    .where(...)

但这会导致

ArgumentError: You have passed Hash object to #or. Pass an ActiveRecord::Relation object instead.

形成“OR”子句的正确方法是什么?

【问题讨论】:

    标签: ruby-on-rails-5 where-clause finder


    【解决方案1】:

    正如错误所说,您必须传递 ActiveRecord::Relation,现在您正在传递 { :programs => { :number => nil} } 哈希。

    尝试:

    orders = Order.joins(...).joins(...).left_outer_joins(customer: :program)
    orders.where.not(programs: { number: excluded_numbers })
          .or(orders.where(programs: { number: nil }))
          .where(...)
    

    or 起作用的条件是 这两个关系必须在结构上兼容,因此,两者都必须包含您正在使用的连接和 left_outer_joins。这就是将它们存储在局部变量中的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 2014-04-28
      • 2014-06-11
      • 2019-10-09
      • 2012-10-11
      • 1970-01-01
      相关资源
      最近更新 更多