1

同じクラスの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 

私はこれを理解しようと何日も費やしてきましたが、ポインタが役立つでしょう。私が使っている宝石はこれです。

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

この問題について何時間も頭を悩ませた後(1年後)、この分野でのすべての研究を要約したいと思いました。

残念ながら、これはdatabasedotcomgemの未解決のバグです。問題は、現在、sfdcクライアントがクラスインスタンス変数ではなくクラス変数であるため、マテリアライズされたオブジェクトがクライアント間で共有されることです。

これについては、 63号と73号で詳しく説明されています。ここからいくつかのオプションがあります:

  1. モンキーパッチを使う
  2. 上記の問題にはプルリクエストを使用してください
  3. databasedotcomを使用します-gemを分離します
  4. databsedotcomを破棄し、複数のsfdc組織を処理するために構築された新しいrestforcegemを使用します。

抵抗が最も少ない道なので、とりあえずモンキーパッチを使います。

于 2012-11-16T07:43:15.227 に答える
0

これは、databasedotcomgemのバグが原因です。イニシャライザファイルにモンキーパッチを追加することで、この問題に対処できます。

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