我正在使用第三方库(gem)来实例化同一类的两个版本。gem 的文档实例化了这个类
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")
例如,看起来联系人已被实体化到全局命名空间中。这是从 gem 调用的实现方法
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
我花了几天时间试图弄清楚任何指针都会有所帮助。我正在使用的宝石是这个。