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
様々な情報を共有していただき、ありがとうございます!
上のブログの記事も参考にさせていただきます!!
サポートの選択肢が増えていく中、最適となる選択の判断が難しくなっているかと存じます。今回は問題の解決に最適となるサポートの選択方法を、紹介させて頂きます。 選択肢のご紹介...
By Mirai Oct 7, 20242023年初頭、Shopifyペイメントアカウント、及びShopifyアカウント全体のセキュリティを強化する為の変更が適用されました。ユーザーのアカウントセキュリティを強化す...
By Mirai Sep 30, 2024概要: 年末/年明けは、消費者が最もショッピングを行う時期の一つです。特に、ブラックフライデー・サイバーマンデー(BFCM)は、世界中で注目される大規模なセールイベントであ...
By JapanGuru Sep 25, 2024