由于我的继承结构
,我在STI表中搜索记录时遇到问题class User < ActiveRecord::Base
class LegacyUser < User
class AuthUser < User
class SuperUser < AuthUser
class FieldUser < AuthUser
class ClientAdmin < AuthUser
问题是find不适用于AuthUser Model。该查询正在寻找类型“AuthUser”,并且不包括其他三种可能性。
编辑:在玩这个时,它开始工作,但仅适用于ClientAdmin和FieldUser,因此似乎应该内置此功能。但现在它已回到原始问题
答案 0 :(得分:3)
我刚遇到同样的问题并找到了解决方案here。
简而言之,问题是中间抽象类无法在加载之前知道它的子类是什么。要解决此问题,您可以手动加载该类文件底部的所有子类。
所以在auth_user.rb的底部:
require_dependency 'super_user'
require_dependency 'field_user'
require_dependency 'client_user'
答案 1 :(得分:2)
AuthUser模型是否会单独使用?
如果它只是继承类之间共享方法的类,则可以尝试将其设置为抽象类。这样ActiveRecord就可以直接通过它。
在AuthUser的声明中,只需添加self.abstract_class = true
,如下所示:
class AuthUser < User
self.abstract_class = true
end
我不知道这种情况是否有效,但值得一试。
答案 2 :(得分:0)
由于STI在Rails中的工作方式(它将模型名称存储在名为“type”的数据库列中),我看不出它如何支持您在上面描述的层次结构 - 我认为您只限于一个级别层次结构。