下面是模型(我使用的是SQLLite 3):
class School < ActiveRecord::Base
validates_uniqueness_of :name
end
例如,在我添加“Yale”之后,我不能添加“Yale”,但 * 可以 * 添加“yale”。我如何使验证不区分大小写?
编辑:找到了-Active Record Validations
下面是模型(我使用的是SQLLite 3):
class School < ActiveRecord::Base
validates_uniqueness_of :name
end
例如,在我添加“Yale”之后,我不能添加“Yale”,但 * 可以 * 添加“yale”。我如何使验证不区分大小写?
编辑:找到了-Active Record Validations
4条答案
按热度按时间7ajki6be1#
validates_uniqueness_of :name, :case_sensitive => false
可以做到这一点,但请记住,如果您有多个服务器/服务器进程(例如运行Phusion Passenger、多个Mongrels等)或多线程服务器,validates_uniqueness_of
* 不 * 保证唯一性,因为您可能会得到以下事件序列(顺序很重要):1.进程A收到创建名为'foo'的新用户的请求
1.流程B执行相同的操作
1.进程A通过询问DB这个名称是否存在来验证'foo'的唯一性,DB说这个名称还不存在。
1.进程B执行相同的操作并得到相同的响应
1.进程A为新记录提交
insert
语句并成功1.如果数据库约束条件要求该字段具有唯一性,则进程B将提交新记录的
insert
语句,并出现 * fail *,同时从SQL适配器返回一个难看的服务器异常。如果没有数据库约束条件,则插入将成功,现在有两行名称为'foo'。另请参见
validates_uniqueness_of
Rails文档中的"并发性和完整性"。从Ruby on Rails 3rd Edition开始:
...不管它的名字是什么,validates_unique_of并不能真正保证列值是唯一的。它所能做的只是验证没有列的值与执行验证时正在验证的记录中的值相同。有可能同时创建两个记录,每个记录都具有相同的值,而该值应该是唯一的。并且两个记录都通过验证。强制唯一性的最可靠方法是使用数据库级约束。"
另请参阅this programmer's experience与
validates_uniqueness_of
。一种常见的情况是在创建新账户时,网页上出现了意外的重复提交。这是一个很难解决的问题,因为用户会得到第二个(丑陋的)错误,这会让他们认为他们的注册失败了,而实际上注册成功了。我发现防止这种情况的最好方法就是使用javascript来防止重复提交。
kx1ctssn2#
在rails 3中,您可以在模型中执行此操作:
或不区分大小写
相同的解决方案适用于Rails 6
fsi0uk1n3#
有一个选项可用于指定不区分大小写
ogq8wdun4#
还有一个类似的问题,但答案更有趣:https://stackoverflow.com/a/6422771
基本上,使用
:case_sensitive => false
执行的数据库查询效率非常低。