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验证多个属性的唯一性的主要内容,如果未能解决你的问题,请参考以下文章