簡體   English   中英

在單表繼承機制中使用動態創建的類

[英]Using dynamically created classes in a Single Table Inheritance mechanism

我有一個稱為'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 ,它們也繼承得很好。

我可能要完成什么?

還有什么需要做的嗎?

您的錯誤消息表明無法找到'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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM