メソッドとコールバックでデフォルト値を設定する(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ガイド


確認すると、デフォルト値がセットされていることがわかります。