2012-11-02 72 views
1

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

回答

0

我剛剛發佈了一個圍繞寶石的包裝,讓你走過這個問題。 它的工作原理有點像:

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

0

我想在這個問題上(一年之後)把我的頭撞了幾個小時後總結了我在這個領域的所有研究。

不幸的是,這是databasedotcom gem中的一個突出的錯誤。問題是,目前sfdc客戶端是一個類變量而不是類實例變量,所以我們的物化對象在客戶端之間共享!

它在問題6373中有詳細討論。你從這裏幾個選項:

  1. 使用monkey patch
  2. 使用拉請求上述問題
  3. 使用databasedotcom-isolate gem
  4. 扔掉databsedotcom並使用新的restforce gem這是專爲處理多個sfdc orgs。

我現在正在與猴子補丁,因爲它是阻力最小的路徑。

0

這是由於在databasedotcom寶石bug。您可以通過在初始化文件中添加一個猴子補丁來解決該問題

# config/initializers/databasedotcom.rb 
Databasedotcom::Sobject::Sobject.class_attribute :client