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
様々な情報を共有していただき、ありがとうございます!
上のブログの記事も参考にさせていただきます!!
Shopifyの請求書の支払いが失敗したという通知を受け取って驚いたことはありますか。初めての支払いでエラーが発生したり、これまで何の問題もなく支払いできていたのに突然失敗し...
By Minami_ Sep 8, 20242023年2月、Shopifyはcheckout.liquidを廃止し、Checkout Extensibilityに移行することを発表いたしました。この新しいチェックアウト...
By JasonH Aug 15, 2024「味噌の可能性を、とき放つ」をコンセプトに、豊かな自然に恵まれた信州で味噌の製造販売を行う新田醸造。江戸末期に創業した老舗のみそ屋さんですが、2024年春、顧客層や販売範囲の...
By Minami_ Jul 30, 2024