如何使用ShopifyAPI(Ruby on Rails)有效地更新许多ShopifyAPI :: Product实例?

Tom*_*mek 2 ruby-on-rails shopify

我正在编写一个应用程序,该应用程序将位于供应商专有的库存管理系统与其Shopify商店之间。该应用程序将根据库存管理系统生成的新数据定期更新Shopify。它还将提供Shopify Webhooks的端点。

我目前正在做这样的事情(伪红宝石,省略了很多东西):

  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
Run Code Online (Sandbox Code Playgroud)

别处:

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

这似乎效率很低,因为我必须先获取每个更新的ShopifyAPI :: Product和ShopifyAPI :: Variant,然后才能更新它们(我的ID在本地缓存)。一个更新周期大约需要25分钟,更新周期将更新24个产品的16个变体。Rails花了不到2秒的时间来更新我的产品/各种代理。其余99%的时间都花在与Shopify交谈上。我一定做错了什么。

鉴于我知道远程对象的ID,有没有一种方法可以直接更新它而不必先获取它?

干杯,-tomek

Dav*_*ood 5

首先,您可以通过其父产品更新变体。抓住产品后,它将带有变体信息,因此您可以对其进行编辑,保存,并将更改保存在单个API调用中。这样可以节省您一些时间。

第二:您可以使用gem在本地创建一个对象,给它提供一个ID,然后调用save来发起PUT请求,而无需先从Shopify获取该对象。这样的事情应该可以解决问题:

product = ShopifyAPI::Product.new(:id => 1, :title => "My new title")
product.save
Run Code Online (Sandbox Code Playgroud)

将这两件事放在一起应该可以为您提供所需的功能:能够在单个API调用中更新产品的变体。

注意:shopify_apigem是基于Active Resource构建的,以供将来参考,因此您可以对该库执行的任何操作都可以与gem一起执行。