同じクラスの2つのバージョンをインスタンス化するために、サードパーティのライブラリ(gem)を使用しています。宝石のドキュメントはクラスをインスタンス化します
client.sobject_module = My::Module
client.materialize("Contact") #=> My::Module::Contact
そして私のコードはこれを行います。
client.sobject_module = MyModule
client.materialize("Contact")
モジュール自体は空です
module MyModule
end
同じコードには2つのバージョンがありますが、
MyModule::Contact.find("John")
たとえば、連絡先がグローバル名前空間に組み込まれたようです。これは、宝石から呼び出されるマテリアライズメソッドです
def materialize(classnames)
classes = (classnames.is_a?(Array) ? classnames : [classnames]).collect do |clazz|
original_classname = clazz
clazz = original_classname[0,1].capitalize + original_classname[1..-1]
unless const_defined_in_module(module_namespace, clazz)
new_class = module_namespace.const_set(clazz, Class.new(Databasedotcom::Sobject::Sobject))
new_class.client = self
new_class.materialize(original_classname)
new_class
else
module_namespace.const_get(clazz)
end
end
classes.length == 1 ? classes.first : classes
end
new_classのクライアントは正しく設定されているように見えますが、
MyModule::Contact.client
と同じクライアントを返します
MyModule1::Contact.client
私はこれを理解しようと何日も費やしてきましたが、ポインタが役立つでしょう。私が使っている宝石はこれです。