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
首先,您可以通过其父产品更新变体。抓住产品后,它将带有变体信息,因此您可以对其进行编辑,保存,并将更改保存在单个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_api
gem是基于Active Resource构建的,以供将来参考,因此您可以对该库执行的任何操作都可以与gem一起执行。