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

我使用 Rails 3.0.0.beta4

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

这里有一个属性是语法

validates :zipcode, :uniqueness => true

谢谢

【问题讨论】:

    标签: ruby-on-rails validation


    【解决方案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]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      • 2014-09-20
      • 1970-01-01
      • 2022-11-15
      • 1970-01-01
      相关资源
      最近更新 更多