How to efficiently update many ShopifyAPI::Product instances using ShopifyAPI (Ruby on Rails)?

前提是你 提交于 2020-01-04 05:27:13

问题


I am writing an app which will sit between a vendors proprietary inventory management system and their Shopify shop. The app will periodically update Shopify from new data generated by the inventory management system. It will also provide end-points for Shopify webhooks.

I am currently doing something like this (pseudo-ruby with much stuff omitted):

  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

Elsewhere:

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

This seems terribly inefficient as I have to fetch each updated ShopifyAPI::Product and ShopifyAPI::Variant before I can update them (I have their id's cached locally). It takes about 25 minutes for an update cycle updating 24 products each with 16 variants. Rails spends less than 2 seconds updating my product/variant proxies. The other 99% of the time is spent talking to Shopify. I must be doing something wrong.

Given that I know the id of the remote object is there a way to updated it directly without having to fetch it first?

cheers, -tomek


回答1:


First things first: You can update variants through their parent product. Once you've grabbed the product it'll have the variant info with it so you can edit them, save, and the changes will be persisted in a single API call. That'll save you some time.

Second: You can create an object locally using the gem, give it an id, and then call save to initiate the PUT request without first fetching the object from Shopify. Something like this should do the trick:

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

Putting those two things together should give you what you want: The ability to update a product's variants in a single API call.

Note: For future reference, the shopify_api gem is built on Active Resource, so anything you can do with that library you can do with the gem.



来源:https://stackoverflow.com/questions/12798708/how-to-efficiently-update-many-shopifyapiproduct-instances-using-shopifyapi-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!