2

ベンダー独自の在庫管理システムとShopifyショップの間に位置するアプリを書いています。アプリは、在庫管理システムによって生成された新しいデータからShopifyを定期的に更新します。また、ShopifyWebhookのエンドポイントも提供します。

私は現在このようなことをしています(多くのものが省略された疑似ルビー):

  def update_product_with_proxy(product_proxy)
    product_proxy.variant_proxies.dirty.each do |variant_proxy|
      update_variant_with_proxy(variant_proxy)
    end

    if product_proxy.dirty_proxy
      shopify_product = ShopifyAPI::Product.find(product_proxy.shopify_id)
      shopify_product.update_attributes({some attributes here})
    end
  end

他の場所:

  def update_variant_with_proxy(variant_proxy)
    shopify_variant = ShopifyAPI::Variant.find(variant_proxy.shopify_id)
    shopify_variant.update_attributes({some attributes here})
  end

更新する前に、更新されたShopifyAPI::ProductとShopifyAPI::Variantをそれぞれフェッチする必要があるため、これは非常に非効率的です(IDはローカルにキャッシュされています)。更新サイクルには、それぞれ16のバリアントを持つ24の製品を更新するのに約25分かかります。Railsは私の製品/バリアントプロキシの更新に2秒もかかりません。残りの99%は、Shopifyとの会話に費やされています。私は何か間違ったことをしているに違いない。

リモートオブジェクトのIDを知っているとすると、最初にフェッチしなくても、リモートオブジェクトを直接更新する方法はありますか?

乾杯、-tomek

4

1 に答える 1

5

まず最初に:親製品を介してバリアントを更新できます。製品を取得すると、バリアント情報が含まれるため、編集、保存が可能になり、変更は1回のAPI呼び出しで保持されます。それはあなたにいくらかの時間を節約するでしょう。

2番目:gemを使用してローカルでオブジェクトを作成し、IDを指定してから、saveを呼び出して、最初にShopifyからオブジェクトをフェッチせずにPUTリクエストを開始できます。このような何かがトリックを行う必要があります:

product = ShopifyAPI::Product.new(:id => 1, :title => "My new title")
product.save

これら2つのことを組み合わせると、必要なものが得られるはずです。1回のAPI呼び出しで製品のバリアントを更新する機能。

注:今後の参考のために、shopify_apigemはアクティブリソース上に構築されているため、そのライブラリで実行できることはすべて、gemで実行できます。

于 2012-10-09T15:52:54.637 に答える