🦔
Rails で特定のカラムの値を暗黙的に正規化する
例えば文字列型のカラムを保存するときに『前後の空白文字を取り除いた状態で DB に保存したい』みたいなことはよくあると思います。
そういう場合は Rails 7.1 で追加された ActiveRecord::Base.normalizes
で比較的簡単に実現することができます。
class User < ActiveRecord::Base
# with に正規化するための処理を記述する
normalizes :email, with: -> (email) { email.strip }
end
# 前後のスペースが除かれた状態で割り当てられる
user = User.build(email: " hoge@example.com ")
pp user.email
# => "hoge@example.com"
# #email= でも同じようになる
user.email = " foo@example.com "
pp user.email
# => "foo@example.com"
user.save!
# find_by などで検索する値も自動で正規化される
pp User.find_by(email: " foo@example.com ").email
# => "foo@example.com"
今までは before_validation
とかに処理をフックしてこういう正規化を行うことが多かったんですがこれだと値が割り当てられたタイミングで正規化されるのでより使い勝手がよいものになりますねー。
Discussion