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 设置密钥?