我有一组 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 条件的问题仅在开发应用程序环境中?