Rails"validates_uniqueness_of"区分大小写

Gee*_*ock 89 validation model ruby-on-rails

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

class School < ActiveRecord::Base

  validates_uniqueness_of :name

end
Run Code Online (Sandbox Code Playgroud)

例如,在我添加"耶鲁"后,我无法添加"耶鲁",但可以添加"耶鲁".如何使验证不敏感?

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

Jor*_*ugh 226

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

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

另请参阅validates_uniqueness_ofRails文档中的"并发性和完整性" .

来自Ruby on Rails第3版:

...尽管名称如此,validates_uniqueness_of并不能真正保证列值是唯一的.它所能做的就是验证没有列与执行验证时验证的记录中的列具有相同的值.可以同时创建两个记录,每个记录对于应该唯一的列具有相同的值,并且两个记录都可以通过验证.强制唯一性的最可靠方法是使用数据库级约束."

又见这个程序员的经验validates_uniqueness_of.

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

  • 作为注释 - 这是我已经提交给Rails的补丁,试图通过使用db-level约束来解决这个问题:https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3486 - 其它对validates_uniqueness_of-使用-DB-约束 (4认同)
  • 非常彻底的回答. (3认同)

Max*_*nus 72

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

validates :name, :uniqueness => true
Run Code Online (Sandbox Code Playgroud)

或没有case_sensitivity

validates :name, :uniqueness => {:case_sensitive => false}
Run Code Online (Sandbox Code Playgroud)

  • 我做 Rails 已经超过 10 年了。我简直不敢相信我只是在学习这个选项。在 Rails 中总有一些新东西需要学习……无论一个人的技能水平如何。 (3认同)

vri*_*h88 23

您可以选择指定不区分大小写的选项

  validates_uniqueness_of :name, :case_sensitive => false
Run Code Online (Sandbox Code Playgroud)