Rails 5通过OR加入activerecord范围

时间:2018-10-19 03:05:21

标签: ruby-on-rails activerecord

我想用OR加入2个作用域。

scope :unassigned, -> {
  where(dongle_id: nil)
}

scope :driverless, -> {
  left_outer_joins(:customer).where(customers: { id: nil })
}

现在我正在执行此操作,因为我无法弄清楚:

scope :inactive, -> {
  left_outer_joins(:customer).where(
    'customers.vehicle_id IS ? OR vehicles.dongle_id IS ?', nil, nil
  )
}

2 个答案:

答案 0 :(得分:1)

  

范围表示数据库查询的范围缩小,例如where(color::red).select('shirts。*')。includes(:washing_instructions)(https://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-scope

无法使用OR条件加入合并范围。范围通过某些过滤器缩小了结果集。将范围链接在一起等效于同时使用范围过滤器,即SQL的AND条件。

对于需要将两个合并范围合并在一起的情况,您可以合并其结果集:

Vehicle.unassigned.to_a | Vehicle.driverless.to_a

但是最好像您已经写过的那样编写另一个作用域。

答案 1 :(得分:-1)

这是您要寻找的东西吗?

scope :inactive, -> { unassigned.or(driverless) }