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

9bfwbjaz  于 2023-02-01  发布在  Ruby
关注(0)|答案(4)|浏览(165)

下面是模型(我使用的是SQLLite 3):

class School < ActiveRecord::Base

  validates_uniqueness_of :name

end

例如,在我添加“Yale”之后,我不能添加“Yale”,但 * 可以 * 添加“yale”。我如何使验证不区分大小写?
编辑:找到了-Active Record Validations

7ajki6be

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 experiencevalidates_uniqueness_of
一种常见的情况是在创建新账户时,网页上出现了意外的重复提交。这是一个很难解决的问题,因为用户会得到第二个(丑陋的)错误,这会让他们认为他们的注册失败了,而实际上注册成功了。我发现防止这种情况的最好方法就是使用javascript来防止重复提交。

kx1ctssn

kx1ctssn2#

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

validates :name, :uniqueness => true

或不区分大小写

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

相同的解决方案适用于Rails 6

validates :name, uniqueness: { case_sensitive: false }
fsi0uk1n

fsi0uk1n3#

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

validates_uniqueness_of :name, :case_sensitive => false
ogq8wdun

ogq8wdun4#

还有一个类似的问题,但答案更有趣:https://stackoverflow.com/a/6422771
基本上,使用:case_sensitive => false执行的数据库查询效率非常低。

相关问题