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

Posted

技术标签:

【中文标题】rails 3验证多个属性的唯一性【英文标题】:rails 3 validation on uniqueness on multiple attributes 【发布时间】:2011-03-17 14:36:09 【问题描述】:

我使用 Rails 3.0.0.beta4

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

这里有一个属性是语法

validates :zipcode, :uniqueness => true

谢谢

【问题讨论】:

【参考方案1】:

在 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]

【讨论】:

我会说从逻辑上讲,您需要 recorded_at 在邮政编码范围内是唯一的更有意义。 validate :recorded_at, : uniqueness => :scope => :zipcode 你仍然可以使用 rails 2 方式,我发现它更具可读性,除非你对同一个属性进行多种类型的验证。 你会用validates :zipcode, :uniqueness => :scope => [:recorded_at, :something_else]验证一组三人吗? 我要补充一点,如果你想在外键上使用 :scope,你需要使用 :fkey_id 符号,而不是 :fkey 符号,即使是“基本”:uniqueness工作于:fkey 您可能想要添加自定义错误消息,例如 , :message => ' is taken for this recorded date'【参考方案2】:

多个作用域参数:

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

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

【讨论】:

Greg 似乎对使用“验证”快捷方式更感兴趣,因此对他的问题的更快回答是“是” 了解这一点非常重要,如果我在检查范围内的关联时是否应该使用 _id(或不使用),我正在寻找这一点。 此答案适用于 Rails 4.1.6 validates_uniqueness_of :cart_id, scope: [:location_id, :plug_id]【参考方案3】:

不要为我工作,需要将 scope 放入 复数

validates_uniqueness_of :teacher_id, :scopes => [:semester_id, :class_id]

【讨论】:

以上是关于rails 3验证多个属性的唯一性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rails 在 MongoDB 中验证跨模型的唯一性?

Rails 4查询由单个属性唯一

Rails 3:验证组合值

Devise for Rails中的唯一用户名

重叠属性对的唯一性验证

无法使用 shoulda 匹配器获得唯一性验证测试通过