1

我正在使用第三方库(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 

我花了几天时间试图弄清楚任何指针都会有所帮助。我正在使用的宝石是这个

4

3 回答 3

0

我刚刚发布了一个围绕 gem 的包装器,让您可以解决这个问题。它的工作原理有点像:

Databasedotcom::Isolated.perform(options) do
  # Constants are materialized automatically
  contact = Contact.last  

  # Work with them as needed
  puts contact.inspect
end

# And everything get's cleaned up behind you.
defined? Contact # => nil

它目前处于早期阶段,但我希望它适合您的需求。源代码在https://github.com/sagmor/databasedotcom-isolated

于 2013-01-17T14:59:46.620 回答
0

在这个问题上敲了几个小时之后(一年后),我想总结一下我在这个领域的所有研究。

不幸的是,这是 databasedotcom gem 中的一个突出错误。问题是,目前 sfdc 客户端是类变量而不是类实例变量,因此我们的物化对象在客户端之间共享!

问题6373中对此进行了详细讨论。您可以从这里获得多种选择:

  1. 使用猴子补丁
  2. 对上述问题使用拉取请求
  3. 使用databasedotcom-isolate gem
  4. 扔掉 databsedotcom 并使用新的restforce gem,它是为处理多个 sfdc 组织而构建的。

我暂时选择猴子补丁,因为它是阻力最小的路径。

于 2012-11-16T07:43:15.227 回答
0

这是由于 databasedotcom gem 中的一个错误。您可以通过在初始化程序文件中添加猴子补丁来解决此问题

# config/initializers/databasedotcom.rb
Databasedotcom::Sobject::Sobject.class_attribute :client
于 2013-09-25T23:01:36.087 回答