【问题标题】:Ruby validates_uniqueness_of email leading to wrong SQL uniqueness checkRuby validates_uniqueness_of 电子邮件导致错误的 SQL 唯一性检查
【发布时间】:2014-01-02 22:29:50
【问题描述】:

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

SELECT `users`.id FROM `users` WHERE (`users`.`email` = BINARY '--- !ruby/object:Mail::Multibyte::Chars \nwrapped_string: joebloggs@joebloggs.com\n') 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

提前感谢您的帮助。

【问题讨论】:

  • 您有什么理由不让设计验证您的模型?
  • 你们有什么样的 DBMS?
  • @Zane:SQL 中的反引号表示它是 MySQL,问题正文中的“关于在 MySQL 中尝试创建记录”也是如此。
  • '--- !ruby/object:Mail::Multibyte::Chars ... 是一个 YAML 化的 Mail::Multibyte::Chars 对象,而不是您的模型可能期望的字符串。电子邮件地址来自哪里?你看过stackoverflow.com/q/14824179/479863吗?

标签: sql ruby-on-rails ruby devise validates-uniqueness-of


【解决方案1】:

在您的用户模型中,您可以将电子邮件验证添加到唯一性为 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

【讨论】:

    猜你喜欢
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多