Ruby on rails 同一表rails模型中两个字段的唯一性

Ruby on rails 同一表rails模型中两个字段的唯一性,ruby-on-rails,ruby,Ruby On Rails,Ruby,是否有方法验证同一模型中两个或多个字段的唯一性?例如,假设我有字段:name和:zip。可接受的集合应该是{[name1,zip1],[name1,zip2]},但不能在同一个表中包含{[name1,zip1],[name1,zip1]} 是否有可以使用的rails验证方法?您应该使用范围: validates_uniqueness_of :name, :scope => [:zip] 有关更多信息,请参阅和 您可以使用:scope选项指定用于限制唯一性检查的其他属性。另一种方法 v

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


是否有可以使用的rails
验证方法?

您应该使用
范围

  validates_uniqueness_of :name, :scope => [:zip]
有关更多信息,请参阅和

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

另一种方法

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

您可以像其他人告诉您的那样使用验证来实现这一点,但也可以向表中添加唯一的索引。这将防止在数据库层上插入重复项,并提高选择速度。您需要为
rails g migration addUniqueIndexForZipAndNameToTablename

add_index :tablename, [:name, :zip], :unique => true
您可能遇到的唯一问题是,当您尝试插入一个副本时,会出现MySQL错误,您需要使用

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

这是否意味着名称不能相同?:name和:zip不能同时相同。“您可以使用:scope选项指定用于限制唯一性检查的其他属性。”有点不清楚。限制是否意味着它使属性具有唯一性?它意味着对象按
:scope
参数分组,并且在组中按
:name
检查唯一性。如果未指定
:范围
,则检查整个表的唯一性。在另一种情况下,对具有相同
:scope
参数的对象检查唯一性。那么说
验证:name,scope:[:zip,:name]
的唯一性是否合法?