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