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

时间:2013-04-09 20:59:33

标签: ruby-on-rails ruby class dynamic single-table-inheritance

我有一个名为'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时,它们也继承了......

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

还有其他事需要做吗?

1 个答案:

答案 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