Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7.1: ActiveRecord::Batchesで複合主キーの昇順/降順を個別に指定可能になった(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

日本語タイトルは内容に即したものにしました。

参考: 週刊Railsウォッチ20230628: 複合主キーを持つテーブルのfind_eachfind_in_batchesin_batchesで:asc、:descを指定可能になった

Rails 7.1: ActiveRecord::Batchesで複合主キーの昇順/降順を個別に指定可能になった(翻訳)

Rails 7.1のActiveRecord::Batchesのメソッドに、複合主キーを持つモデルに関連する機能強化が導入されました。この更新により、開発者は複合主キーのキーごとに昇順や降順を指定できるようになります。

🔗 Rails 7.1より前

Rails 7.1より前は、id_1id_2などの複合主キーを持つレコードをバッチ処理するときに、引数に:asc:descを指定してソート順を制御できましたが、このソートの仕組みに制限がありました。 ソート順序を:ascまたは:descで指定すると、id_1id_2の両方に同時に影響します。つまり、昇順を指示するとid_1id_2が両方とも昇順でソートされます。同様に、降順を指定すると、id_1id_2が両方とも降順でソートされます。

この制限は、特に複合主キーで個別のキーに異なる基準を指定してレコードをソートする必要がある場合に実用上の影響が生じます。

🔗 Rails 7.1以後

Rails 7.1の新しい機能強化により、複合主キー内で個別のキーのソート順を指定できるようになりました。コード例で見てみましょう。

複合主キーcategory_idproduct_idを持つProductモデルがあるシナリオを考えてみましょう。category_idを降順で、product_idを昇順で商品を取得したいとします。これはRails 7.1で簡単に実行できます。

class Product < ActiveRecord::Base
  self.primary_key = [:category_id, :product_id]
end

# Retrieving products in descending order of
# category_id and ascending order of product_id
Product.find_each(order: [:desc, :asc]) do |product|
  # Your processing logic for each product goes here
end

ActiveRecord::Batchesに含まれるfind_eachメソッドは 、データベースレコードを効率よくバッチ処理するのに使われます。このメソッドはレコードを小さなバッチ単位で取得するので、メモリ消費が削減され、パフォーマンスが向上します。このメソッドにはorderオプションを渡せます。Rails 7.1 では、複合主キー内にある個別のキーにソート順を指定するシンボルを配列で渡せるようになりました。

複合主キーのソート順指定の機能強化はfind_eachメソッドだけにとどまらず、ActiveRecord::Batchesで提供されるfind_in_batchesin_batchesにも同様に適用されます。これらのメソッドもfind_eachのように、バッチでレコードを効率よく取得して処理できるようになります。

🔗 まとめ

Rails 7.1では、複合主キーを利用するモデルをバッチ処理するときに複数カラムのソート順指定をサポートしたとこで、アプリケーションのデータ取得プロセスの柔軟性と制御が向上しました。Rails開発作業で特定のニーズに合わせて複合キーのソート順を調整可能になり、より強力で汎用性の高いツールセットを提供します。

詳しくは#48268を参照してください。

関連記事

Rails 7.1.0 Active Record CHANGELOG(翻訳)

Rails 8: 組み込みのレート制限APIを導入(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。