やったこと
ActiveRecord のコールバックが呼ばれるタイミングを調べてみます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
$ sqlite3 --version
3.20.1 2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34
調査
テーブル確認
sqlite> .schema books
CREATE TABLE IF NOT EXISTS "books" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "status" integer, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
app/models/book.rb
class Book < ApplicationRecord
before_validation Proc.new {
Rails.logger.fatal('call before_validation')
}
after_validation Proc.new {
Rails.logger.fatal('call after_validation')
}
before_create Proc.new {
Rails.logger.fatal('call before_create')
}
around_create Proc.new {
Rails.logger.fatal('call around_create')
}
after_create Proc.new {
Rails.logger.fatal('call after_create')
}
after_commit Proc.new {
p 'p after_commit'
Rails.logger.fatal('call after_commit')
}
### around_save Proc.new {
### Rails.logger.fatal('call afround_save')
### }
before_save Proc.new {
Rails.logger.fatal('call before_save')
}
after_save Proc.new {
Rails.logger.fatal('call after_save')
}
end
出力結果 (コンソール)
irb(main):001:0> Book.create(title: 33)
(0.0ms) begin transaction
call before_validation
call after_validation
call before_save
call before_create
call around_create
call after_create
call after_save
(0.0ms) commit transaction
=> #<Book id: nil, title: "33", status: nil, created_at: "2020-03-15 08:18:52", updated_at: "2020-03-15 08:18:52">
Rails5 では after_commit は、動かないようので要注意です。