ruby-on-rails – Rails“validates_uniqueness_of”区分大小写

这里是模型(我使用SQLLite3):

class School < ActiveRecord::Base

  validates_uniqueness_of :name

end

例如,在我添加“Yale”后,我不能添加“Yale”,但可以添加“yale”。如何使验证情况不敏感?

编辑:找到它 – Active Record Validations

validates_uniqueness_of:name,:case_sensitive => false的伎俩,但你应该记住,validates_uniqueness_of不保证唯一性,如果你有多个服务器/服务器进程(例如运行Phusion Passenger,多个Mongrels等)或多线程服务器。这是因为你可能得到这个事件序列(顺序很重要):

>进程A获取创建名为“foo”的新用户的请求
>进程B做同样的事情
>进程A通过询问DB是否存在该名称来验证’foo’的唯一性,并且DB指出该名称还不存在。
>进程B做同样的事情,得到相同的响应
>进程A提交新记录的insert语句并成功
>如果您的数据库约束需要该字段的唯一性,则Process B将提交新记录的insert语句,并且失败,并返回从SQL适配器返回的丑陋的服务器异常。如果没有数据库约束,插入将成功,现在有两行,以“foo”作为名称。

另请参见validates_uniqueness_of Rails文档中的“并发和完整性”。

Ruby on Rails 3rd Edition

…despite its name, validates_uniqueness_of doesn’t really guarantee that column values will be unique. All it can do is verify that no column has the same value as that in the record being validated at the time the validation is performed. It’s possible for two records to be created at the same time, each with the same value for a column that should be unique, and for both records to pass validation. The most reliable way to enforce uniqueness is with a database-level constraint.”

另请参见this programmer’s experience with validates_uniqueness_of。

这种情况通常发生的一种方式是在创建新帐户时从网页进行的意外双重提交。这是一个很难解决的,因为用户会得到的是第二个(丑陋的)错误,它会让他们认为他们的注册失败,当实际上它成功了。我发现阻止这种情况的最好的方法只是使用javascript来尝试防止双重提交。

http://stackoverflow.com/questions/690664/rails-validates-uniqueness-of-case-sensitivity

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:ruby-on-rails – Rails“validates_uniqueness_of”区分大小写