Rails 7.1: ActiveRecord::Batchesで複合主キーの昇順/降順を個別に指定可能になった(翻訳)
Rails 7.1のActiveRecord::Batches
のメソッドに、複合主キーを持つモデルに関連する機能強化が導入されました。この更新により、開発者は複合主キーのキーごとに昇順や降順を指定できるようになります。
🔗 Rails 7.1より前
Rails 7.1より前は、id_1
やid_2
などの複合主キーを持つレコードをバッチ処理するときに、引数に:asc
や:desc
を指定してソート順を制御できましたが、このソートの仕組みに制限がありました。 ソート順序を:asc
または:desc
で指定すると、id_1
とid_2
の両方に同時に影響します。つまり、昇順を指示するとid_1
とid_2
が両方とも昇順でソートされます。同様に、降順を指定すると、id_1
とid_2
が両方とも降順でソートされます。
この制限は、特に複合主キーで個別のキーに異なる基準を指定してレコードをソートする必要がある場合に実用上の影響が生じます。
🔗 Rails 7.1以後
Rails 7.1の新しい機能強化により、複合主キー内で個別のキーのソート順を指定できるようになりました。コード例で見てみましょう。
複合主キーcategory_id
、product_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_batches
やin_batches
にも同様に適用されます。これらのメソッドもfind_each
のように、バッチでレコードを効率よく取得して処理できるようになります。
🔗 まとめ
Rails 7.1では、複合主キーを利用するモデルをバッチ処理するときに複数カラムのソート順指定をサポートしたとこで、アプリケーションのデータ取得プロセスの柔軟性と制御が向上しました。Rails開発作業で特定のニーズに合わせて複合キーのソート順を調整可能になり、より強力で汎用性の高いツールセットを提供します。
詳しくは#48268を参照してください。
概要
元サイトの許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。
参考: 週刊Railsウォッチ20230628: 複合主キーを持つテーブルの
find_each
、find_in_batches
、in_batches
で:asc、:descを指定可能になった