У меня возникают некоторые проблемы при попытке пропустить default_scope
при выполнении ActiveRecord join
.
Несмотря на то, что кодовая база довольно большая, я просто показываю основы, так как думаю, что она довольно хорошо показывает, в чем проблема:
class Client
belongs_to :company
end
class Company
default_scope { where(version_id: nil) }
end
Я создаю сложный отчет, поэтому мне нужно объединить несколько таблиц и отфильтровать их. Однако я не могу успешно пропустить область по умолчанию при получении Client
s.
Client.joins(:company).to_sql
# SELECT clients.* FROM clients INNER JOIN companies
# ON companies.id = clients.company_id AND companies.version_id IS NULL
Как видите, автоматически включается Company
default_scope
. Итак, я попробовал это:
Company.unscoped { Client.joins(:company) }.to_sql
# SELECT clients.* FROM clients INNER JOIN companies
# ON companies.id = clients.company_id AND companies.version_id IS NULL
Опять же, я получил тот же результат, даже при использовании unscoped
с блоком.
Затем я решил добавить новую модель в модель с областью действия unscoped
:
class Client
belongs_to :company
belongs_to :unscoped_company, -> { unscoped }, foreign_key: :company_id, class_name: "Company"
end
Добавив это, я дал еще одну попытку:
Client.joins(:unscoped_company).to_sql
# SELECT clients.* FROM clients INNER JOIN companies
# ON companies.id = clients.company_id AND companies.version_id IS NULL
И все же прицел применяется.
Знаете ли вы, как я могу успешно объединить обе таблицы без применения этого default_scope
?
Удаление этого default_scope
не вариант, так как это большое приложение и изменение, которое потребует слишком много времени.
Rails v4.2.7
Ruby v2.2.3