Shopify アプリに関する話題はこちら
カスタムアプリで、大量の注文データの中から特定の商品(バリエーション)を含むものを検索する機能を開発しています。
カスタムアプリの開発環境は以下の通りです。
以下のコードの通り、REST API を通して Order を大量に取得し、それぞれの Order の LineItem に検索したバリエーションが含まれるかどうかを走査するという実装を行いました。
class Order < ShopifyAPI::Order
MAX_ORDER_LIMIT_PER_PAGE = 250class << 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
上記コードの処理速度がかなり遅く(数十件注文のデータの検索に、数十秒かかる)、困っています。
数十から数百の注文データから特定商品を含むデータを検索するにあたって、より良いコードの書き方があれば、教えていただけると有り難いです。
GraphQLのご利用をお勧めします。
https://shopify.dev/docs/admin-api/graphql/reference
https://shopify.dev/docs/admin-api/graphql/reference/bulk-operations/bulkoperation
@junichiokamura さん、ご回答ありがとうございます。
GraphQL も試しに使ってみたのですが、「ある商品(Variant)を、明細(lineItems)含む注文(Order)」を1リクエストで処理できなかった事もあり、期待していたほど速度が出ず、もあきらかけていました。
ただ、BulkOperation については知りませんでした。
教えていただいてありがとうございます!
少なくとも、これでリクエストのタイムアウトは防げそうな気がしました。
試してみます。
なるほど。
扱っているデータは違いますが、以下のようなブログもあるので参考にしてみてください。
https://www.shopify.jp/blog/partner-graphql-shopify-metafields
山田繊維株式会社(むす美)は京都の地で風呂敷製造卸売業:山田貫七商店として昭和12年に創業。メイン商材は1000年以上前から使われているという記録がある風呂敷で、その他ハンカチや袱...
By Nanami Jan 12, 2023過去に失われた売り上げを回復するには?Shopifyの新しい自動化機能を活用し、失われた売り上げを簡単に回復する方法を学びましょう!
By Mirai Jan 10, 2023オンラインストアの構築が完了しましたら、一般公開をする前にいくつかのテスト注文を行い、チェックアウトプロセスを確認することが大事です。Shopifyペイメントをご利用いただいている...
By rinaflora Dec 4, 2022