我有一个名为'DynObject'的ActiveRecord类,可用于继承..
在初始化时,我动态创建一些继承它的类:
classes_config = { foo: 'foo', bar: 'bar' }
classes_config.each do |name,options|
klass = Class.new( DynObject ) do
end
self.klasses[name] = const_set( "#{name.camelize}DynObject", klass )
end
这一切都很好,这些类创建得很好..但是当ActiveRecord尝试加载创建的记录时,STI机制会失效.. (ActiveRecord::SubclassNotFound (The single-table inheritance mechanism failed to locate the subclass: 'FooObject'....))
我觉得这很奇怪,因为当我检查类在type
列中的命名时,它们就存在了。
当我检查这些类的ancestors
时,它们也继承了......
我有可能想要完成的事情吗?
还有其他事需要做吗?
答案 0 :(得分:1)
您的错误消息表明无法找到“FooObject”类。
在您的代码中,动态生成的类名称应为'FooDynObject'。
在加载DynObject之前,只需检查数据库中是否有旧的测试记录。
@edit: 另一件事也是要知道你影响动态类名的类。
class DynObject < ActiveRecord::Base
const_set 'FooDynObject', Class.new(DynObject)
end
将导致DynObject :: FooDynObject,并且ActiveRecord在看到'FooDynObject'类型时将无法加载它。
在个人情况下,我会像
那样做class DynObject < ActiveRecord::Base
Object.const_set 'FooDynObject', Class.new(DynObject)
end