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
2月に、新しい英語版AMAディスカッションボードで2週間にわたって初めてのコミュニティAMAを開催しました。
By SarahF_Shopify Mar 19, 2023不正注文やチャージバック被害はビジネスへ大きな被害を与えます、このブログでは簡単な防止策を紹介し、ストア保護を最適化します
By Mirai Mar 13, 2023Eコマースの自動化に関して大きな告知がございます。2022年3月22日より、Shopify FlowをAdvanced(プレミアム)プランの全てのご利用者様に提供を開始しました。...
By Nanami Feb 17, 2023