ActiveRecordのvalidates :numericalityはnilを受け付けないらしい
Rails 3のActiveRecord(ActiveModelと言った方が正確なのでしょうか?)のvalidatesで整数のチェックをしようと、
class Foo < ActiveRecord::Base validates :bar, :numericality => { :only_integer => true } # 整数のみ end
というふうに書いておき、アプリでbar属性に妥当な値が設定できないので、nilを設定してcreate!メソッドを呼んだところ、
/opt/local/lib/ruby1.9/gems/1.9.1/gems/activerecord-3.1.0.rc1/ lib/active_record/validations.rb:56:in `save!': Validation failed: Bar is not a number (ActiveRecord::RecordInvalid) from /opt/local/lib/ruby1.9/gems/1.9.1/gems/activerecord-3.1.0.rc1/ lib/active_record/attribute_methods/dirty.rb:33:in `save!'
という具合にエラーになってしまいました。
validates :presence => true # 値が空でないか
を書いていないのに、ってところがポイントで、もしかしたら、validatesを書くとvalidates :presenceを暗黙的に含んでいるという扱いなのでしょうか?RDBMS側は整数型カラムでもNULLABLEならレコード突っ込めたりするので(といいつつRDBMSによってまちまちかも)、合わせた動作をしてくれれば嬉しかったところです。before_validationでデフォルト値を設定するなどで回避しようと思えばできそうですが、今回は何も設定したくなかったので、ちょっと使いにくいですね。