在 Rails 5 中,如何编写一个 finder "OR" 查询来表示从列表中排除或为 nil?

In Rails 5, how do I write a finder "OR" query to say exlucde from a list or be nil?

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

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" 子句的正确方法是什么?

如错误所述,您必须传递 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 你'重新使用。这就是将它们存储在局部变量中的目的。