【问题标题】:Uniqueness with two fields in the same table rails model同一个表rails模型中两个字段的唯一性
【发布时间】:2012-07-09 07:28:50
【问题描述】:

有没有办法验证同一模型中两个或多个字段的唯一性?例如,假设我有字段:name:zip。可接受的集合是 {[name1, zip1], [name1, zip2]},但您不能在同一个表中包含 {[name1,zip1],[name1,zip1]}

有没有railsvalidates方法可以用?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    你应该使用scope:

      validates_uniqueness_of :name, :scope => [:zip]
    

    请参阅documentationguide 了解更多信息。

    您可以使用:scope 选项指定用于限制唯一性检查的其他属性。

    【讨论】:

    • 这不是说名字不能一样吗?
    • :name 和 :zip 同时不能相同。
    • "您可以使用 :scope 选项来指定用于限制唯一性检查的其他属性。"有点不清楚。限制是否意味着它使属性包含唯一性?
    • 表示对象按:scope参数分组,并在:name分组中检查唯一性。如果未指定:scope,则检查整个表的唯一性。在其他情况下,检查具有相同:scope 参数的对象的唯一性。
    • 所以说validates_uniqueness_of :name, scope: [:zip, :name]合法吗?
    【解决方案2】:

    您可以使用其他人告诉您的验证来执行此操作,但您也可以向表中添加唯一索引。这将防止在数据库层上插入重复项并提高选择速度。您需要为该 rails g migration addUniqueIndexForZipAndNameToTablename 创建一个新的迁移

    add_index :tablename, [:name, :zip], :unique => true
    

    您可能遇到的唯一问题是当您尝试插入重复项时出现 MySQL 错误,您需要使用

    begin
      # insert,...
    rescue ExceptionHere
      # do sth...
    end
    

    【讨论】:

      【解决方案3】:

      另一种方式

      validates :name, :uniqueness => {:scope => [:zip]}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        相关资源
        最近更新 更多