Rails 5 соединяет области активной записи с помощью OR - PullRequest
0 голосов
/ 19 октября 2018

Я хотел бы объединить 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 голосов
/ 19 октября 2018

Область представляет собой сужение запроса к базе данных, например, где (цвет:: красный) .select ('рубашки. *'). Includes (: washing_instructions) (https://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-scope)

Объединение областей с использованием условия OR невозможно. Область действия сужает набор результатов с помощью некоторого фильтра. Объединение областей вместе эквивалентно одновременному использованию фильтров области действия, то есть условия SQL AND.

Для вашего случая, когда 2Области должны быть объединены с ИЛИ, вы можете объединить их наборы результатов:

Vehicle.unassigned.to_a | Vehicle.driverless.to_a

, но лучше написать другую область, как вы уже сделали.

0 голосов
/ 19 октября 2018

Это то, что вы ищете?

scope :inactive, -> { unassigned.or(driverless) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...