Ruby validates_uniqueness_of电子邮件导致错误的 SQL 唯一性检查



当用户在我的 Ruby 网站上注册时,我看到以下 SQL 用于检查电子邮件地址(例如 joebloggs@joebloggs.com)是否唯一:

SELECT `users`.id FROM `users` WHERE (`users`.`email` = BINARY '--- !ruby/object:Mail::Multibyte::Chars nwrapped_string: joebloggs@joebloggs.comn') LIMIT 1

这始终会导致返回零行,因此 Ruby 尝试在数据库中创建用户。 在尝试在 MySQL 中创建记录时,它失败了,因为 users.email 有一个唯一的索引。

谁能告诉我为什么Ruby要生成上面的SQL语句? 它在以生产或开发模式运行的实时站点上执行此操作。 在我的开发站点(在生产或开发模式下运行)上,将生成以下(正确的)SQL:

SELECT `users`.id FROM `users` WHERE (`users`.`email` = BINARY 'joebloggs@joebloggs.com') LIMIT 1

对于用户管理,我使用以下设置使用设计:

validates_uniqueness_of :email

提前感谢您的帮助。

在用户模型中,您可以将电子邮件验证添加到唯一性中,作为 false。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable,:registerable,
         :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:email]
  validate :email, presence: true, uniqueness: false
end

最新更新