FROM CACHE - jp_header
このコミュニティはピアツーピアサポートに移行しました。Shopify サポートは今後、このコミュニティへのサービスを提供いたしません。これからもぜひ、他のマーチャントやパートナーとつながり、サポートし合い、経験を共有してください。 当社の行動規範に違反する行動や削除を希望するコンテンツがありましたら、引き続きご報告ください

APIを通した大量データの処理時間改善について

APIを通した大量データの処理時間改善について

soutetsu
観光客
3 0 0

カスタムアプリで、大量の注文データの中から特定の商品(バリエーション)を含むものを検索する機能を開発しています。

カスタムアプリの開発環境は以下の通りです。

  • Ruby on Rails v6.0.3 + shopify_api gem v9.2.0

以下のコードの通り、REST API を通して Order を大量に取得し、それぞれの Order の LineItem に検索したバリエーションが含まれるかどうかを走査するという実装を行いました。

 

class Order < ShopifyAPI::Order
  MAX_ORDER_LIMIT_PER_PAGE = 250

  class << self
    def all_pages(per_page = Order::MAX_ORDER_LIMIT_PER_PAGE)
      all_orders = []
      page = 1
      orders = Order.find(:all, params: {limit: per_page})
        all_orders << orders
        while orders.next_page?
        page += 1
        orders = orders.fetch_next_page
        all_orders << orders
    end
    all_orders.flatten
  end

  # !! このメソッドが遅い
  def find_by_variant_id(variant_id)
    orders = []
    Order.all_pages.each do |order|
      if order.paid?
        if order.line_items.find { |line_item|
          line_item.variant_id == variant_id.to_i
        }
          orders << order
      end
     end
   end
   orders
 end
end

 

上記コードの処理速度がかなり遅く(数十件注文のデータの検索に、数十秒かかる)、困っています。

数十から数百の注文データから特定商品を含むデータを検索するにあたって、より良いコードの書き方があれば、教えていただけると有り難いです。

 

 

4件の返信4

junichiokamura
Community Manager
1201 280 509
soutetsu
観光客
3 0 0

@junichiokamura さん、ご回答ありがとうございます。

GraphQL も試しに使ってみたのですが、「ある商品(Variant)を、明細(lineItems)含む注文(Order)」を1リクエストで処理できなかった事もあり、期待していたほど速度が出ず、もあきらかけていました。

ただ、BulkOperation については知りませんでした。

教えていただいてありがとうございます!

少なくとも、これでリクエストのタイムアウトは防げそうな気がしました。

試してみます。

 

junichiokamura
Community Manager
1201 280 509

なるほど。

扱っているデータは違いますが、以下のようなブログもあるので参考にしてみてください。

https://www.shopify.jp/blog/partner-graphql-shopify-metafields

 

Senior Partner Solutions Engineer
soutetsu
観光客
3 0 0

様々な情報を共有していただき、ありがとうございます!

上のブログの記事も参考にさせていただきます!!