ActiveRecordのバリデーションはいつ起こるか
Railsに詳しい人と話していて、ActiveRecordのバリデーションはいつ実行されるかというのを完全に誤解していたというか、基本を理解していなかったことに気づいた。Active Record Validations and Callbacksの説明によれば、
create、create!、save、save!、update、update_attributes、update_attributes!
の7つのメソッドが、バリデーションが走るもの。DBへSQLが発行される。ビックリマークは例外を発生させるメソッド。
ActiveRecord::Baseのオブジェクトには、メモリ上にのみあるもの、DB上に対応する行が生成されれているものの2種類がある。
ActiveRecord::Base#newで作ったオブジェクトは、メモリ上にしか存在せず、saveかsave!を実行するとDBに書き出される。で、ActiveRecord::Base#createは、実はnewとsaveを両方やってしまうメソッドだったらしい。
activerecord/lib/active_record/base.rb def create(attributes = nil, &block) if attributes.is_a?(Array) attributes.collect { |attr| create(attr, &block) } else object = new(attributes) yield(object) if block_given? object.save object end end
図にすると、こんな感じか。