Rails 3验证多个属性的唯一性


177

我使用Rails 3.0.0.beta4

我想在两个属性上添加关于唯一性的验证,这意味着如果'recorded_at''zipcode'唯一,则我的模型有效。

在一个属性上是语法

validates :zipcode, :uniqueness => true

谢谢

Answers:


333

在Rails 2中,我会写:

validates_uniqueness_of :zipcode, :scope => :recorded_at

在Rails 3中:

validates :zipcode, :uniqueness => {:scope => :recorded_at}

对于多个属性:

validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}

7
从逻辑上讲,更合理地说您需要recorded_at在邮政编码范围内唯一。 validate :recorded_at, : uniqueness => { :scope => :zipcode }
2010年

2
您仍然可以按照Rails 2的方式进行操作,除非您对同一个属性进行几种类型的验证,否则我认为它更具可读性。
zem

24
您会验证一组三个validates :zipcode, :uniqueness => {:scope => [:recorded_at, :something_else]}吗?
格雷格·吉达

5
我想补充一点,如果你要使用:scope外键,您需要使用:fkey_id的符号,而不是:fkey那些,即使是“基本” :uniqueness适用于:fkey
nbarraille

1
您可能想要添加自定义错误消息,例如, :message => ' is taken for this recorded date'
laffuste 2014年

96

多个范围参数:

class TeacherSchedule < ActiveRecord::Base
  validates_uniqueness_of :teacher_id, :scope => [:semester_id, :class_id]
end

http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of

这应该回答格雷格的问题。


格雷格似乎对使用“验证”快捷方式更感兴趣,因此对他的问题的更快回答是“是”
选出

要知道这一点很重要,我一直在仔细检查是否要在检查范围内的关联时使用_id。
Francesco Belladonna

这个答案在Rails 4.1.6中有效validates_uniqueness_of:cart_id,范围:[:location_id,:plug_id]
Conor

6

我不工作,需要把范围复数

validates_uniqueness_of:teacher_id,:scope s => [:semester_id,:class_id]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.