Rails validates_uniqueness_of 跨越多个不区分大小写的列

Posted

技术标签:

【中文标题】Rails validates_uniqueness_of 跨越多个不区分大小写的列【英文标题】:Rails validates_uniqueness_of across multiple columns with case insensitivity 【发布时间】:2011-01-13 23:41:57 【问题描述】:

我有一个模型,它有两个字段,我将其称为 first_name 和 last_name,并且我想确保这两者的组合是不区分大小写的唯一的。通过使用这个,我已经成功了一半:

validates_uniqueness_of :first_name, :scope => :last_name

问题是唯一性检查似乎是区分大小写的,尽管the documentation 说默认情况下它应该不区分大小写。所以给定一个现有的记录:

 :first_name => 'John', :last_name => 'Smith' 

这是允许的:

 :first_name => 'JOHN', :last_name => 'SMITH' 

以及在名字或姓氏中有任何大小写变化的任何附加记录。为什么允许这些记录?如何在两个字段中同时强制执行不区分大小写的唯一性?

【问题讨论】:

【参考方案1】:

你试过validates_uniqueness_of :first_name, :scope => :last_name, :case_sensitive => false吗?

documentation says 默认为 true。

(我认为您提供的链接指向一些过时的文档。IIRC,在过去几年中,默认值确实发生了变化。)

【讨论】:

你是对的!我被我找到的文档误导了。设置:case_sensitive => false 使它适用于first_name,但它不适用于另一个方向。它仍然会接受 :first_name => 'John', :last_name => 'SMITH' 。有没有办法让它双向工作?我是否只需包含两个 validates_uniqueness_of 规则并交换字段? 我尝试通过交换两个字段添加另一个验证。它现在将捕获其中一个字段大小写不同的情况,但如果两者都不同,则不会,所以这仍然可以通过: :first_name => 'JOHN', :last_name => 'SMITH' 如果我是你,我会在此时编写一个自定义验证方法。 您应该分享您的自定义验证方法供其他人学习。 :) github.com/jimmycuadra/morethingsneed.to/blob/…

以上是关于Rails validates_uniqueness_of 跨越多个不区分大小写的列的主要内容,如果未能解决你的问题,请参考以下文章

markdown [rails:devise] Ruby on Rails的身份验证gem。 #ruby #rails

Rails:如何在 Rails 中为 Devise 设置密钥?

从 Rails 2 到 Rails 3 路由

Rails:在 Rails 控制器中捕获所有异常

如何在带有 Rails 4.2 的专用调试端口上使用工头启动 Rails?

Rails 4 的 Rails_admin 批量分配错误