メソッドとコールバックでデフォルト値を設定する(Rails)
マイグレーションファイルではなく、メソッドとコールバックでデータのデフォルト値を設定する方法について書きます。
前提
Reportモデルのemotionのデフォルト値を
2
にしたいメソッドを作成
# app/models/report.rb def set_default_emotion self.emotion ||= 2 end
||=
は遅延初期化です
遅延初期化については以下のサイトで確認できます
[初心者向け] RubyやRailsでリファクタリングに使えそうなイディオムとか便利メソッドとか - Qiita
コールバックを設定
# app/models/report.rb after_initialize :set_default_emotion, if: :new_record?
after_initialize
コールバックを使用して、newしたらデフォルト値をセットさせます
しかし、after_initialize
は個々のreport画面に遷移したときにも呼び出されます
そのため、新しくデータ(レコード)を作成する場合のみ呼び出したいのでif: :new_record?
を追加します
after_initializeコールバックは、Active Recordオブジェクトが1つインスタンス化されるたびに呼び出されます。インスタンス化は、直接newを実行する他にデータベースからレコードが読み込まれるときにも行われます。
Active Record コールバック - Railsガイド
確認すると、デフォルト値がセットされていることがわかります。