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

时间:2012-10-09 11:06:36

标签: 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

其他地方:

  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)。更新周期大约需要25分钟,更新24个产品,每个产品有16个变种。 Rails花费不到2秒的时间来更新我的产品/变体代理。其他99%的时间用于与Shopify交谈。我一定是做错了。

鉴于我知道远程对象的id有没有办法直接更新它而不必先获取它?

欢呼声, -tomek

1 个答案:

答案 0 :(得分:3)

首先要做的事情是:您可以通过其父产品更新变体。一旦你抓住了产品,就会有变量信息,因此你可以编辑它们,保存,并且更改将在一次API调用中保留。那会节省你一些时间。

第二:你可以使用gem在本地创建一个对象,给它一个id,然后调用save来启动PUT请求,而无需先从Shopify中获取对象。这样的事情可以解决问题:

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

将这两者放在一起应该可以满足您的需求:在单个API调用中更新产品变体的能力。

注意:为了将来参考,shopify_api gem建立在Active Resource上,因此您可以使用该库对该库执行任何操作。