在单表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
- TPLB 3 OpenSSL解密AES-256-CBC使用Ruby 2.0.0 OpenSSL :: Cipher加密
- 将rubygem收集从一台机器转移到另一台机器的最佳实践
- 在en.yml文件中更改属性名称不起作用
- load / require / require_relative如何处理没有文件扩展名的文件?
- 带有attr_accessor的类上的Ruby instance_eval
- 从ruby中的HTML元素中提取背景图像
- 如何更改“设计:密码重置指令电子邮件的主题”
- Rails 5请求运行时间超过5000毫秒
- Rspec any_instance.stub为nil引发未定义的方法`any_instance_recorder_for’:NilClassexception