モデルの属性のデフォルト値

テーブルはnull不可にしといてvalidates_presence_ofで値が設定されていない場合にエラーが出るようにしたい。モデルのデフォルト値は、各AdapterでDBのテーブルから取得したカラムの情報を元につくられたColumnオブジェクトのdefaultが使用されるので、MySQLの場合、マイグレーションで :null => false を指定すると :default => nil は無視されて、テーブルのカラムのデフォルト値は0となる。するとモデルの属性のデフォルト値も0になるのでvalidates_presence_ofに引っ掛からない。


テーブルのレコードのデフォルト値とモデルのデフォルト値を対応しないものにする、っていうのはダメなのかなとも思った。


でも、やっぱりvalidates_presence_ofに引っ掛かって欲しいので、attributes_from_column_definitionをオーバーライド*1して、superの戻り値に自前のデフォルト値を設定するのが良さ気に思えたんで、やってみたらうまくいっちゃった。


これでいいのかな?何か間違っている気がする。

*1:initializeをオーバーライドすればいい気もするけど、initializeだと引数のattributesに指定されている値も考慮しないといけないのでスマートじゃない気がした