【Rails】before_createとbefore_validationの違い
Railsには、データベースに保存する前に指定した処理を実行できる「コールバック」という仕組みがあります。中でもbefore_createとbefore_validationは、データの保存やバリデーション(入力チェック)に関わる重要なコールバックです。今回はこの2つの違いと、それぞれがどう使えるかについてまとめました。
この記事の目的
• before_createとbefore_validationがいつ実行されるかを理解する。
• どんな場合に使えばいいか、実際の使いどころを知る。
1. before_createとは?
before_createは、レコードが新しく作成されてデータベースに保存される直前に一度だけ実行されるコールバックです。例えば、レコードを新しく作成するときだけ特定の初期設定を入れたい場合に使います。
使用例
ユーザーのデータを新しく作成するとき、statusを「active」に設定したい場合は、こんなふうに使えます。
class User < ApplicationRecord
before_create :set_default_status
private
def set_default_status
self.status = "active"
end
end
• 実行タイミング: 新しいレコードが作成される直前に一度だけ。
• 用途: レコードが最初に作成されるときだけ自動で設定したいデータがあるとき(例:初期ステータスの設定など)。
2. before_validationとは?
before_validationは、レコードが保存される前のバリデーション(入力チェック)を実行する直前に呼ばれます。このコールバックは、新しく作成されるときも、既存のレコードを更新するときも、バリデーションが走るタイミングで毎回実行されます。
使用例
たとえば、ユーザーが入力したメールアドレスに余分なスペースが入っていてもエラーにならないように、保存する前にスペースを取り除く処理を入れることができます。
class User < ApplicationRecord
before_validation :normalize_email
private
def normalize_email
self.email = email.strip if email.present?
end
end
• 実行タイミング: バリデーションが走る直前。
• 用途: データの保存前に余分なスペースを削除したり、入力内容を修正したい場合。
3. before_createとbefore_validationの違い
コールバック 実行タイミング 使う場面の例
before_create 新規作成直前に一度だけ 初期ステータスを設定するなど
before_validation バリデーション実行直前に毎回 データをきれいに整える場合
注意点
• before_createは新しく作成されるときだけ実行されますが、before_validationはバリデーションの前に毎回実行されるため、新規作成と更新のどちらでも動きます。
• 入力をきれいに整える処理は、バリデーション前に呼ばれるbefore_validationのほうが向いています。
まとめ
before_createとbefore_validationは、データの保存前に処理を追加したいときに便利なコールバックです。どのタイミングで動いてほしいかによって使い分けると、コードがわかりやすくなり、意図通りに動くようになります。