validates_uniqueness_of问题

时间:2011-01-19 10:53:01

标签: ruby-on-rails validation authlogic

我在我们的网站上使用rails 2.3.5和Authlogic,并且我一直在通过重复电子邮件试图保存的用户的hoptoad获得数据库错误。问题是,显然我在模型上有validates_uniqueness_of :email

在我的开发测试中,我得到了预期的验证错误,用户没有保存,但在生产中,我一直在DB层上出现这个错误。

我已使用区分大小写的电子邮件进行了测试,并且还经过了正确验证。

我已经检查了这个类,并且没有attr_accessor或任何其他属性覆盖,我不认为Authlogic会以错误的方式执行此操作...

生产中可能会发生什么?是否存在rails验证不起作用的情况?

3 个答案:

答案 0 :(得分:1)

在开发日志中找到运行validates_uniqueness_of的SQL,如果看到类似WHERE (email = BINARY 'foo@example.com')的内容,请尝试使用FOO@EXAMPLE.COM创建用户,现在可以重现数据库级别的重复异常

要解决此问题,请将以下代码放入config/initializers/patches.rb

class ActiveRecord::ConnectionAdapters::Mysql2Adapter
  def case_sensitive_equality_operator
    "="
  end
end

请注意,如果您使用的是Rails 2,则Mysql2Adapter应为MysqlAdapter

另一方面,它是Rails IMO中一个长期存在的错误 - 在Ruby级别处理区分大小写根本没有意义。如果需要区分大小写的查找,则应具有utf8_bin的列排序规则。如果需要不区分大小写的查找,则应具有utf8_general_ci的列排序规则。在where子句中应用BINARY函数将禁用索引,每次尝试创建/更新记录时,validates_uniqueness_of都会导致全表扫描。如果你有数百万的记录,你就完全搞砸了。上面的补丁也将解决这个问题 - 事实上,这是我创建该补丁的最初动机。

如果您同意,请+1到https://github.com/rails/rails/issues/1399:)

答案 1 :(得分:0)

您是否尝试重新创建方案?为什么要抛出保证Hoptoad通知的错误。我的意思是,基本上如果你有一个它不应该保存用户而不是为hoptoad抛出错误通知你。

同样使用authlogic,我认为您不需要为电子邮件指定validate_uniqueness_of。通常authlogic会为您处理。

所以我猜,是时候深度潜水了。

查看日志,并尝试在本地重新创建此错误。它总是最好回溯导致错误的步骤。

更多细节,错误堆栈,代码肯定会有所帮助。

答案 2 :(得分:0)

只是猜测,但可能是您的电子邮件列允许空,validates_uniqueness_of忽略零(或空白)值,并且您的用户正在尝试注册而未指定其电子邮件地址?