【結論】
・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
メソッドなどでもコールバックが実行されてしまうという欠点があります。
なので、安易に実装すると思わぬ不具合を招く恐れがある為、取り扱いには注意が必要です。
参考情報
Ruby - これは ActiveModelのafter_initialize ということでしょうか?|teratail
Railsのコールバックまとめ | TECHSCORE BLOG
《今日の学習進捗(3年以内に10000時間に向けて)》
CKEditorの機能拡張(ファイルアップロード・動画埋め込み・テンプレートなど)を行ったが、やはりユーザーのニーズを満たすには程遠い仕様だと感じる。
CKEditorに頼らないCMSの実装が必要だと改めて実感した。
なお、サービスの本格リリースに必要な機能は、現状私のタスクを残すのみなので、全体のスケジュールが遅延しない様に、なんとか今週中には形にしたい。
学習開始からの期間 :214日
今日までの合計時間:2072h
一日あたりの平均学習時間:9.7h
今日までに到達すべき目標時間:1954h
目標との解離:118h
「10,000時間」まで、
残り・・・「7928時間!」