devise + paranoia を使った論理削除の実装が簡単、かつ便利なわけですが、実装時に参考にした以下のページに、
Rails4+devise+paranoiaで退会ユーザーの論理削除を簡単に実現する
削除済のユーザーと同じemailを登録しようとするとユニーク制約にひっかかり、登録できない
Rails4 + devise + paranoiaで論理削除を考慮したユーザーバリデーションを実現する
これで解決できると思ったら・・・
Rails4.2ではvalidates_uniqueness_of_without_deleted が undefined method になる。。
Issueにもあがってたのね。。
validates_uniqueness_of_without_deleted undefined in Rails 4.2
Rails4.2でユーザーバリデーションを実現する方法はないですかねぇ。。。
とあり困っておりました。
で、結局は destroy
直後にメールアドレスを変更しちゃえばいいんじゃないかと思い立ち、
class Users::RegistrationsController < Devise::RegistrationsController
...
def destroy
...
resource.destroy
resource.update(email: resource.deleted_at.to_i.to_s + '_' + resource.email.to_s)
...
ってオーバーライドしたらいい感じに動きました。
論理削除後のメールアドレスは [POSIX Time]_[元のメールアドレス]
になり、余程の事がなければ衝突はしないだろうし /lib/
内の devise の元のコード触るのも気が引けたので、むしろこっちのが良いかなと考えています。