我正在使用第三方庫(gem)來實例化相同Class的兩個版本。寶石的文檔實例化類在rails中實例化模塊
client.sobject_module = My::Module
client.materialize("Contact") #=> My::Module::Contact
而我的代碼這樣做。
client.sobject_module = MyModule
client.materialize("Contact")
模塊本身是空
module MyModule
end
有相同的代碼的兩個版本,但是當我比如做
MyModule::Contact.find("John")
它出現在取得了聯繫materialed到全球命名空間。這是會從
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似乎得到正確設置寶石叫Materialise的方法,但是當我做
MyModule::Contact.client
返回相同的客戶端作爲
MyModule1::Contact.client
我花了好幾天的時間來解決這個問題,任何指針都會有幫助。我正在使用的寶石是this。