Railsでデータの初期値を設定する方法(DBとモデルの設定パターン)

f:id:ryoutaku_jo:20190710002327p:plain

【結論】

Railsでデータの初期値を設定するには、DB側で設定する方法と、モデルで設定する2通りが存在する

・DBで設定する場合は、マイグレーションファイルの該当カラムのオプションにdefault値を設定する。

・モデルで設定する場合は、after_initializeで対応できる。動的に初期値を設定できる反面、インスタンスが生成されたときに発火する為、whereメソッドなどでもコールバックが実行されるので、実装には注意が必要。

【目次】

【本題】

Railsでデータの初期値を設定する方法

フォームに入力する項目などのデータの初期値を設定する場合、Railsでは主に2通りの方法が存在します。

今回は、その方法についてまとめます。

DB側で設定する方法

まず一つが、DB側で設定する方法です。

これは、マイグレーションファイルの該当カラムのオプションにdefault値を記述して設定する。

t.integer :role, null: false, default: 0

モデルで設定する場合

もう一つは、モデルで設定する方法です。

after_initializeインスタンスを生成した際に、デフォルト値を登録するメソッドを呼び出す様に実装します。

after_initialize :set_default, if: :new_record?

  def set_default
    self.role ||= 1
  end

DBの設定だと決まった値した設定できませんが、モデルの場合だと動的に値を設定する事が出来ます。

モデルで設定する場合の注意点

after_initializeには、インスタンスが生成される度に発火するという特徴があります。

その為、whereメソッドなどでもコールバックが実行されてしまうという欠点があります。

なので、安易に実装すると思わぬ不具合を招く恐れがある為、取り扱いには注意が必要です。

参考情報

Railsのモデルのデフォルト値設定 - Qiita

Ruby - これは ActiveModelのafter_initialize ということでしょうか?|teratail

Railsのコールバックまとめ | TECHSCORE BLOG

after_initializeの使いドコロがわからない

《今日の学習進捗(3年以内に10000時間に向けて)》

CKEditorの機能拡張(ファイルアップロード・動画埋め込み・テンプレートなど)を行ったが、やはりユーザーのニーズを満たすには程遠い仕様だと感じる。

CKEditorに頼らないCMSの実装が必要だと改めて実感した。

なお、サービスの本格リリースに必要な機能は、現状私のタスクを残すのみなので、全体のスケジュールが遅延しない様に、なんとか今週中には形にしたい。

学習開始からの期間 :214日
今日までの合計時間:2072h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:1954h
目標との解離:118h
「10,000時間」まで、

残り・・・「7928時間!」