У меня есть набор подклассов STI, наследуемых от базового класса User
. Я обнаружил, что при определенных условиях внутри определения подкласса запросы к подклассам неправильно используют условие type
.
class User < ActiveRecord::Base
# ...
end
class Admin < User
Rails.logger.info "#{name}: #{all.to_sql}"
# ...
end
При загрузке консоли Rails в процессе разработки она делает то, что я ожидал:
Admin: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Admin')
Но при нажатии на приложение (localhost/pow) отсутствует условие type
, и я получаю следующее:
Admin: SELECT `users`.* FROM `users`
Но не из приложения при развертывании на промежуточном сервере:
Admin: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Admin')
Это, конечно, приводит к тому, что любые запросы, выполняемые здесь, в приложении разработчика (но не из консоли), будут неверными. В частности, я пытаюсь предварительно загрузить (небольшой) кеш существующих значений базы данных, чтобы создать несколько полезных методов на основе этих данных. Без области типа кеш явно неверный!
Из того же места (Admin
) мы получаем следующее сбивающее с толку противоречие:
[11] pry(Admin)> Admin.finder_needs_type_condition?
=> true
[12] pry(Admin)> Admin.send(:type_condition).to_sql
=> "`users`.`type` IN ('Admin')"
[13] pry(Admin)> Admin.all.to_sql
=> "SELECT `users`.* FROM `users`"
Кроме того, я определил одноразовый подкласс Q < User
внутри файла user.rb
. Я зарегистрировал Q.all.to_sql
из его определения, из определения Admin
и из представления. В таком порядке получаем:
From Q: Q: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Q')
From Admin: Q: SELECT `users`.* FROM `users`
From View: Q: SELECT `users`.* FROM `users` WHERE `users`.`type` IN ('Q')
Что может привести к тому, что в первой строке определения подкласса Admin
в admin.rb любой подкласс User
не сможет использовать свой type_condition
?
Это приводит к сбою тестов разработки, что имеет некоторые последствия для моего приложения. Что, черт возьми, может быть причиной такой разницы в поведении? Может ли кто-нибудь придумать более общий способ решения проблемы отсутствия условий STI, определенных для подкласса во время его определения только в среде разработки приложения?