Rails“ validates_uniqueness_of”区分大小写


93

这是模型(我正在使用SQLLite3):

class School < ActiveRecord::Base

  validates_uniqueness_of :name

end

例如,添加“耶鲁”后,便不能添加“耶鲁”,但可以添加“耶鲁”。如何使验证区分大小写?

编辑:找到它- 活动记录验证

Answers:


232

validates_uniqueness_of :name, :case_sensitive => false可以解决问题,但请记住,如果您有多个服务器/服务器进程(例如,运行Phusion Passenger,多个Mongrels等)或多线程服务器,validates_uniqueness_of不能保证唯一性。那是因为您可能会得到以下事件序列(顺序很重要):

  1. 进程A收到创建名称为'foo'的新用户的请求
  2. 流程B做同样的事情
  3. 进程A通过询问数据库是否存在该名称来验证'foo'的唯一性,并且数据库说该名称尚不存在。
  4. 进程B做同样的事情并得到相同的响应
  5. 流程A提交insert新记录的语句并成功
  6. 如果您的数据库约束要求该字段具有唯一性,则流程B将提交insert新记录的语句,并因SQL适配器返回的丑陋服务器异常而失败。如果您没有数据库约束,则插入将成功,并且您现在有两行以'foo'作为名称。

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

Ruby on Rails第三版

...尽管其名称有效,validates_uniqueness_of并不能真正保证列的值是唯一的。它所能做的就是验证在执行验证时没有列的值与要验证的记录中的值相同。可以同时创建两个记录,每个记录具有相同的唯一列值,并且两个记录都可以通过验证。强制执行唯一性的最可靠方法是在数据库级别进行约束。”

又见这个程序员的经验validates_uniqueness_of

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


4
作为一个说明-这里是我所提交的Rails试图通过utlizing分贝级的约束来解决这个问题的补丁: rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/...
乔丹布拉夫

同样,还有一个常年出现的“用户双击提交按钮”的问题,但这更多的是使用:disable_with
Ghoti

76

在rails 3中,您可以在模型中执行以下操作:

validates :name, :uniqueness => true

或不区分大小写

validates :name, :uniqueness => {:case_sensitive => false}

这正是我想要的。
Jigar Bhatt 2015年

1
我从事Rails已有10多年了。我不敢相信我只是在学习这个选项。无论个人的技术水平如何,在Rails中总有一些新东西要学习。
danielricecodes

24

有一个选项可以指定不区分大小写

  validates_uniqueness_of :name, :case_sensitive => false

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.