我在我们的网站上使用rails 2.3.5和Authlogic,并且我一直在通过重复电子邮件试图保存的用户的hoptoad获得数据库错误。问题是,显然我在模型上有validates_uniqueness_of :email
。
在我的开发测试中,我得到了预期的验证错误,用户没有保存,但在生产中,我一直在DB层上出现这个错误。
我已使用区分大小写的电子邮件进行了测试,并且还经过了正确验证。
我已经检查了这个类,并且没有attr_accessor或任何其他属性覆盖,我不认为Authlogic会以错误的方式执行此操作...
生产中可能会发生什么?是否存在rails验证不起作用的情况?
答案 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忽略零(或空白)值,并且您的用户正在尝试注册而未指定其电子邮件地址?