1

我有一个名为“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这些类时,它们也继承得很好..

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

还有什么需要做的吗?

4

1 回答 1

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
于 2013-07-18T10:51:23.583 回答