在单表inheritance机制中使用动态创建的类

我有一个名为’DynObject’的ActiveRecord类,可用于inheritance。

在初始化时,我动态创建一些从它inheritance的类:

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 ,他们也inheritance了…

有可能我想要完成的事情吗?

还有什么需要做的吗?

您的错误消息表明无法找到“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