Rails中的STI继承。查找问题

时间:2009-08-18 20:38:26

标签: ruby-on-rails activerecord single-table-inheritance

由于我的继承结构

,我在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,因此似乎应该内置此功能。但现在它已回到原始问题

3 个答案:

答案 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”的数据库列中),我看不出它如何支持您在上面描述的层次结构 - 我认为您只限于一个级别层次结构。