Rails クイズ: 次のコードで rollback されるのはどれでしょう?

先日、仕事のコードで遭遇して「なんだこの動き...」と思ったので、ブログに書いておく。

Rails クイズ: 次のコードで rollback されるのはどれでしょう?(配点10点)

常にバリデーションエラーになるモデル Bomb と no 属性によってコールバックを制御できる User クラスがあります。

# app/models/bomb.rb
class Bomb < ApplicationRecord
  belongs_to :user
  validate -> { errors.add(:base, ':bomb:') }
end

# app/models/user.rb
class User < ApplicationRecord
  has_many :bombs
  has_one :bomb

  attr_accessor :no

  before_validation -> { bombs.build }, if: -> { no.to_i == 1 }
  before_create     -> { bombs.build }, if: -> { no.to_i == 2 }
  before_validation -> { build_bomb },  if: -> { no.to_i == 3 }
  before_create     -> { build_bomb },  if: -> { no.to_i == 4 }
end

このとき、下記の 1〜4 のコードの内で「 ロールバックされて、DBに保存されない 」のはどれでしょう? 全て挙げなさい。

User.new(no: 1).save!
User.new(no: 2).save!
User.new(no: 3).save!
User.new(no: 4).save!

解答について

解答を書くと面白くないので、気になる人は試してみましょう!