У меня есть набор подклассов 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')
Это, конечно же, вызывает неправильные запросы, которые выполняются в приложении dev (но не с консоли). В частности, я пытаюсь предварительно загрузить (небольшой) кэш существующих значений db, чтобы создать несколько полезных методов на основе этих данных. Без области видимости кеш, очевидно, неверен!
Из того же места (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, определенных в подклассе, во время его определения только в среде разработки приложений?