ActiveRecord のコールバックが呼ばれるタイミングを調べる (Rails)
Ruby Ruby on Rails
Published: 2020-03-15

やったこと

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 は、動かないようので要注意です。

参考