所以我有以下场景。我想创建一个新的用户,但我希望它的电子邮件是唯一的。所以我有以下验证
def uniq_email
errors.add(:email, "Already existing User with email: #{email}") if
User.exists?(email: email)
end
这个效果很好。问题是,当我想更新这个用户,如果我试图改变一个已经存在的电子邮件,它允许我这样做。我试着在验证中添加[:create,:update],但如果我这样做,当我改变它的地址时,例如,它会再次在模型上运行验证,并告诉我该用户的电子邮件已经存在。任何帮助吗?我怎样才能避免这种情况呢?
Thank you:D
您的场景的最佳解决方案是使用validates_uniqueness_of或唯一性,因为它确保了电子邮件在应用程序级别的唯一性。
class User < ActiveRecord::Base
validates_uniqueness_of :email
# or
validates :email, uniqueness: true
end
为了使唯一性防弹,应该在数据库中添加email的唯一索引。如果由于某种原因,您绕过了模型中的验证,那么DB将抛出一个错误。
class MakeEmailUnique < ActiveRecord::Migration
def change
add_index :users, :email, unique: true
end
end
你应该浏览一下Validation Docs文档,了解更多关于如何使用它们的信息。