Problem with validates_uniqueness_of

放肆的年华 提交于 2020-01-06 05:19:12

问题


I'm using rails 2.3.5 and Authlogic in our website, and I have been getting errors on the database through hoptoad of users with duplicated emails trying to be saved. The problem is, obviously I have the validates_uniqueness_of :email on the model.

On my tests here in development I get the expected validation error and the user is not saved, but in production, I keep getting this errors on the DB layer.

I've tested with case sensitive emails and it also validated correctly.

I've checked and the class and there is no attr_accessor or any other attribute override, and I don't think Authlogic would do it in a wrong way...

What could be happening in production? Are there any cases where rails validates doesn't work?


回答1:


Locate the SQL running validates_uniqueness_of in your development log, and if you see something like WHERE (email = BINARY 'foo@example.com'), try creating a user with FOO@EXAMPLE.COM and now you can reproduce the DB-level duplicate exception.

To fix this, put the following code in config/initializers/patches.rb:

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

Note that Mysql2Adapter should be MysqlAdapter if you're on Rails 2.

On a side note, it is a longstanding bug in Rails IMO - handling case-sensitivity in Ruby level doesn't make sense at all. If you need case-sensitive lookup, you should have the column collation of utf8_bin. If you need case-insensitive lookup, you should have the column collation of utf8_general_ci. Applying BINARY function in the where clause will disable the use of index, and validates_uniqueness_of causes full table scan every time you try to create/update a record. If you have millions of records, you're totally screwed. The patch above will fix that, too - in fact, it was my original motivation to create that patch.

If you agree, please +1 to https://github.com/rails/rails/issues/1399 :)




回答2:


Have you tried recreating the scenario. Why should throw errors that warrant Hoptoad Notification. I mean, basically if you have a it should not save the user and not throw an error for hoptoad to notify you about.

Also with authlogic, i don't think you are required to specify the validate_uniqueness_of for email. Usually authlogic will take care of that for you.

So I guess, its time for you to deep dive.

Look at the logs, and try recreating this error locally. Its always best to retrace the steps leading to error.

More details, error stack , code would definitely be helpful.




回答3:


Just a guess but could it be that your email column allows null, validates_uniqueness_of is ignoring nil (or blank) values and that your users are trying to register without specifying their email addresses?



来源:https://stackoverflow.com/questions/4734377/problem-with-validates-uniqueness-of

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!