環境 Rails 5. Paranoia 2.2.0, devise 4.2.0
soft delete を paranoia を使って実装。deviseをつかってuserを実装。
状況として、登録済みのuserをsoft deleteしているとする。このとき、同じemailで再登録をしようとしていると仮定。
このとき、validates においても soft delete されたエントリーは除外されてしまうため、DBへの書き込み時にuniquenessについてのエラーが出てしまう (email に indexつけてたら)。
ref.
https://github.com/rubysherpas/paranoia/issues/319
しょうがないので、custom methods を追加。User.with_deletedについてmanuallyに検査してあげる。
app/model/user.rb
validates :email, email: { strict_mode: true }, presence: true, uniqueness: true
validate :is_unique_from_all_entries, on: :create
def is_unique_from_all_entries
test = User.with_deleted.find_by(email: email)
if test.present?
if test.deleted_at.nil?
errors.add(:email, "is already used.") #ここには来ないはずだが...
else
errors.add(:email, "is soft deleted.") #今回どうにかしたいのはこのケース
end
end
end