2013-04-09 63 views
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機制failes .. (ActiveRecord::SubclassNotFound (The single-table inheritance mechanism failed to locate the subclass: 'FooObject'....))

我認爲這是奇怪的,因爲當我檢查類作爲他們是如何在type列命名,它們的存在..

當我檢查這些類的ancestors他們也繼承就好了..

是否有可能就是我試圖完成?

還有什麼需要做的嗎?

回答

1

您的錯誤消息表示'FooObject'類無法找到。

在你的代碼中,動態生成的類名shoudl是'FooDynObject'。

只要在加載DynObject之前檢查數據庫中沒有舊的測試記錄。

@edit: 另一件事是也知道你影響動態類名稱的類。

class DynObject < ActiveRecord::Base 
    const_set 'FooDynObject', Class.new(DynObject) 
end 

會導致DynObject :: FooDynObject和ActiveRecord的將無法加載它時,它會看到「FooDynObject」類型。

Personnally,我會做些事情像

class DynObject < ActiveRecord::Base 
    Object.const_set 'FooDynObject', Class.new(DynObject) 
end