Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 钢轨的STI固有力。查找的问题_Ruby On Rails_Activerecord_Single Table Inheritance - Fatal编程技术网

Ruby on rails 钢轨的STI固有力。查找的问题

Ruby on rails 钢轨的STI固有力。查找的问题,ruby-on-rails,activerecord,single-table-inheritance,Ruby On Rails,Activerecord,Single Table Inheritance,由于我的继承结构,我在搜索STI表中的记录时遇到问题 class User < ActiveRecord::Base class用户

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

class User < ActiveRecord::Base
class用户

class LegacyUser

class超级用户

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


编辑:在使用该功能时,它开始工作,但仅适用于ClientAdmin和FieldUser,因此似乎应该内置此功能。但是现在,由于STI在Rails中的工作方式(它将模型名称存储在一个名为“type”的数据库列中),它又回到了原来的问题上。我不知道它如何支持您上面描述的层次结构-我认为您仅限于一个单级层次结构。

AuthUser模型将被自己使用吗

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

在AuthUser声明中,只需添加如下内容:

class AuthUser < User
     self.abstract_class = true
end
class-AuthUser

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

我只是遇到了同样的问题并找到了解决方案

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

因此,在auth_user.rb的底部:

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

我的数据库中确实有Type列。起初,我认为我只限于一个级别,但在某一点上,AuthLogic查找到了所有4种可能的类型。现在,它只查看基本类AuthUser类包含3个子类的共享功能。这些附加子类的目的是在permissionsOk方面做出不同的响应,这应该是可行的。我总是这样使用(但不是在STI的中间)。在常规情况下,将其设置为抽象将告诉ActiveRecord不要为该模型查找表,因此在STI中,它应该(根据我的逻辑)不要查找该类型。这意味着,如果您也需要实例化该模型,它将不起作用,但只有使用子类才能起作用。
class AuthUser < User
     self.abstract_class = true
end
require_dependency 'super_user'
require_dependency 'field_user'
require_dependency 'client_user'