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

図にすると、こんな感じか。