Короткая версия:
Есть ли способ "отсканировать" ассоциации ActiveRecord belongs_to
(или других) в Rails 5.0?
Более длинная версия:
Я работаю над проектом Rails, где каждое «задание» назначается «отделу» для целей организации.В большинстве случаев отдел может быть выведен автоматически на основе сведений о задании, но есть несколько случаев, когда задание должно быть вручную назначено другому отделу.
Для решения этой проблемы я добавил department_id
столбец в таблице заданий, чтобы все работало следующим образом:
- Если
department_id
не равен NULL, присоедините задание к Департаменту, как обычно. - В противном случае вернитесь к «выведенной» логике соединения Job / Department.
Согласно документации Rails это возможно:
Могут быть случаи, когда вы захотите настроить запрос, который принадлежит own_to.Такие настройки могут быть достигнуты с помощью блока области.Например:
class Book < ApplicationRecord
belongs_to :author, -> { where active: true },
dependent: :destroy
end
Вы можете использовать любой из стандартных методов запросов внутри блока области действия.
Поэтому я попытался определить отношение следующим образом (упрощено для демонстрационных целей).):
belongs_to :department, -> { unscoped.where(id: 7) }
... идея состоит в том, что .unscoped
удалит логику по умолчанию where departments.id = [jobs.department_id]
, что позволит мне вместо этого определить пользовательское правило.
Однако это не 'на самом деле его не охватывать;сгенерированный SQL:
SELECT `departments`.*
FROM `departments`
WHERE `departments`.`id` = 11 AND `departments`.`id` = 7
LIMIT 1
Я предполагаю, что логика WHERE по умолчанию применяется после Выполнен блок пользовательского запроса, что означает, что .unscoped
не имеет никакого эффекта.
Несколько других вещей:
- Я знаю, что мог бы просто установить
department_id
в «ожидаемое» значение при каждом создании нового задания.Однако это может иметь пару недостатков: - Мне нужно задним числом установить
department_id
каждого существующего задания в базе данных (что может занять достаточно много времени). - Если конкретный тип работы был переназначен в другой отдел по умолчанию, любые существующие работы останутся назначенными «предыдущему» отделу.
- Аналогично, если детали работы будут обновленытак что он попадает под компетенцию другого отдела, пользователь должен будет переназначить его вручную.
- Я знаю, что мог бы определить метод - или пользовательскую область - намодель Job вместо использования
belongs_to
здесь, но для целей этого вопроса скажем, что мне абсолютно необходимо сделать это через отношение ActiveRecord.