2

由于我的继承结构,我在搜索 STI 表中的记录时遇到问题

class User < ActiveRecord::Base

class LegacyUser < User

class AuthUser < User

class SuperUser < AuthUser

class FieldUser < AuthUser

class ClientAdmin < AuthUser

问题是 find 不适用于 AuthUser 模型。该查询正在寻找类型“AuthUser”并且不包括其他三种可能性。

编辑:在玩这个时它开始工作,但只适用于 ClientAdmin 和 FieldUser 所以似乎这个功能应该内置。但现在它又回到了原来的问题

4

3 回答 3

3

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

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

所以在 auth_user.rb 的底部:

require_dependency 'super_user'
require_dependency 'field_user'
require_dependency 'client_user'
于 2011-03-04T02:25:42.997 回答
2

AuthUser 模型会自己使用吗?

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

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

class AuthUser < User
     self.abstract_class = true
end

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

于 2009-08-18T20:58:37.637 回答
0

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

于 2009-08-18T20:45:10.520 回答