RTI中的STI Inheiritance。 查找问题

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

我刚遇到同样的问题并在此找到了解决方案。

简而言之,问题是中间抽象类无法在加载之前知道它的子类是什么。 要解决此问题,您可以手动加载该类文件底部的所有子类。

所以在auth_user.rb的底部:

 require_dependency 'super_user' require_dependency 'field_user' require_dependency 'client_user' 

AuthUser模型是否会单独使用?

如果它只是inheritance类之间共享方法的类,则可以尝试将其设置为抽象类。 这样ActiveRecord可能会直接通过它。

在AuthUser的声明中,只需添加self.abstract_class = true如下所示:

 class AuthUser < User self.abstract_class = true end 

我不知道这种情况是否有效,但值得一试。

由于STI在Rails中的工作方式(它将模型名称存储在名为“type”的数据库列中),我看不出它如何支持您在上面描述的层次结构 – 我认为您仅限于单级层次结构。