🆕

Rails 7.2で個人的に気になった変更点

2024/10/08に公開

はじめに

こんにちは、kmkntです。

本記事では、Rails 7.2の変更点について、CHANGELOGを読んで個人的に気になったものをまとめました。
そのバージョンで目玉となるような新しい機能の追加など、大きな変更点はネット上の様々な記事で紹介されていますが、細かい変更点はあまり触れられていないので、自身のキャッチアップも兼ねて整理したいというのが趣旨になります。参考になれば幸いです。

前回のRails 7.1の記事はこちらです。

https://zenn.dev/socialplus/articles/814624da19d1b3

Active Record

Support touch_all in batches

Post.in_batches.touch_all

バッチ単位でtouch_allできるようになったとのこと。
実運用では一括ではなくバッチ単位でできたほうが良いケースがあると思うので、地味ですがありがたいです。

Add <role>_types class method to ActiveRecord::DelegatedType so that the delegated types can be introspected

例えば以下のようなDelegatedTypeの定義があった場合、

class Entry < ApplicationRecord
  delegated_type :entryable, types: %w[ Message Comment ]
end

Entry.entryable_types["Message", "Comment"]を返すようになるとのこと。
APIリクエスト時のバリデーション等で使うことを想定しているようですが、便利に使えるシーンがありそうです。

Add the ability to ignore counter cache columns until they are backfilled

カウンターキャッシュがバックフィルされるまでは、カウンターキャッシュのカラムを無視できるようになったとのこと。

class Comment < ApplicationRecord
  belongs_to :post, counter_cache: { active: false }
end

上記のようにactive: falseを定義しておくと、sizeなどのメソッドはカウンターキャッシュを使わず、データベースから直接結果を取得するようになります。バックフィルが済んでいない場合、キャッシュから読んでしまうとsizeメソッドが適切な値を返さないため。

既存のテーブルに後からカウンターキャッシュのカラムを追加する必要があるシーンにおいては、まずはactive: falseで定義しておいて、バックフィルを行い、それが済んだら最後にactive: falseを外すという運用をするとよさそうです。

Allow ActiveRecord::Base#pluck to accept hash values

# Before
Post.joins(:comments).pluck("posts.id", "comments.id", "comments.body")

# After
Post.joins(:comments).pluck(posts: [:id], comments: [:id, :body])

上記のとおり、pluckにハッシュを渡せるようになったとのこと。便利です。

Allow for more complex hash arguments for order which mimics where in ActiveRecord::Relation

Topic.includes(:posts).order(posts: { created_at: :desc })

上記のとおり、orderにハッシュを渡せるようになったとのこと。こちらも便利です。

Active Support

Add default: support for ActiveSupport::CurrentAttributes.attribute

class Current < ActiveSupport::CurrentAttributes
  attribute :counter, default: 0
end

上記のとおり、ActiveSupport::CurrentAttributesにdefault値を定義できるようになったようです。

Railties

Rails console now indicates application name and the current Rails environment

my-app(dev)> # for RAILS_ENV=development
my-app(test)> # for RAILS_ENV=test
my-app(prod)> # for RAILS_ENV=production
my-app(my_env)> # for RAILS_ENV=my_env

上記のように、rails console実行時にRAILS_ENVの情報が表示されるようになります。
地味な改修ですが、作業時に自分が間違った環境にいないかどうかの確認はとても大事なのでありがたいですね。

Add options to bin/rails app:update

--force: Accept all changes to existing files
--skip: Refuse all changes to existing files
--pretend: Don't make any changes
--quiet: Don't output all changes made

上記のとおり、bin/rails app:update実行時に指定できるオプションが追加されたようです。
プロジェクトによって手順は異なるかと思いますが、いったんすべて--forceで上書きしてから差分をチェックするという方法を取ることもあるかと思いますので、その際は少し便利になりそうです。

最後に

Rails 8.0がリリースされたら、またCHANGELOGを調べた結果をまとめたいと思います。

SocialPLUS Tech Blog

Discussion