0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

devise + paranoia で validates にも deleted_at で scope されちゃって、 emailなどの uniqueness の validationができない件

Posted at

環境 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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?