2

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

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

  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 有没有办法直接更新它而不必先获取它?

干杯,-托梅克

4

1 回答 1

5

首先要做的事情:您可以通过其父产品更新变体。获取产品后,它会包含变体信息,因此您可以对其进行编辑、保存,并且更改将保留在单个 API 调用中。这样可以节省你一些时间。

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

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

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

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

于 2012-10-09T15:52:54.637 回答