Ruby on rails Rails:验证两列(一起)的唯一性

Ruby on rails Rails:验证两列(一起)的唯一性,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-4,activerecord,rails-activerecord,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 4,Activerecord,Rails Activerecord,我有一个Release模型,其中包含medium和country列(以及其他列)。不应存在共享相同的中等/国家组合的发行版 作为rails验证,我将如何编写此文件 您可以向验证器传递:scope参数,如下所示: validates_uniqueness_of :medium, scope: :country 有关更多示例,请参见。您可以将:scope参数传递给验证器,如下所示: validates_uniqueness_of :medium, scope: :country 有关更多示例,请

我有一个
Release
模型,其中包含
medium
country
列(以及其他列)。不应存在共享相同的
中等
/
国家
组合的
发行版


作为rails验证,我将如何编写此文件

您可以向验证器传递
:scope
参数,如下所示:

validates_uniqueness_of :medium, scope: :country

有关更多示例,请参见。

您可以将
:scope
参数传递给验证器,如下所示:

validates_uniqueness_of :medium, scope: :country
有关更多示例,请参见。

您可以将验证与
范围
选项一起使用

此外,还应向数据库中添加唯一索引,以防止新记录在写入之前同时检查时通过验证:

class AddUniqueIndexToReleases < ActiveRecord::Migration
  def change
    add_index :releases, [:country, :medium], unique: true
  end
end



class Release < ActiveRecord::Base
  validates :country, uniqueness: { scope: :medium }
end
class AddUniqueIndexToReases
您可以使用
范围
选项进行验证

此外,还应向数据库中添加唯一索引,以防止新记录在写入之前同时检查时通过验证:

class AddUniqueIndexToReleases < ActiveRecord::Migration
  def change
    add_index :releases, [:country, :medium], unique: true
  end
end



class Release < ActiveRecord::Base
  validates :country, uniqueness: { scope: :medium }
end
class AddUniqueIndexToReases
以上所有答案都缺少如何验证模型中多个属性的唯一性。下面的代码旨在说明如何在一个作用域中使用多个属性

validates :country, uniqueness: { scope: [:medium, :another_medium] }
它使用
medium
other\u medium
的值验证所有行中
country
的唯一性

注意:别忘了在上述列上添加索引,这确保了快速检索,并为唯一记录添加了DB级验证

更新:用于在创建表时添加索引

t.index [:medium, :another_medium], unique: true

以上所有答案都缺少如何验证模型中多个属性的唯一性。下面的代码旨在说明如何在一个作用域中使用多个属性

validates :country, uniqueness: { scope: [:medium, :another_medium] }
它使用
medium
other\u medium
的值验证所有行中
country
的唯一性

注意:别忘了在上述列上添加索引,这确保了快速检索,并为唯一记录添加了DB级验证

更新:用于在创建表时添加索引

t.index [:medium, :another_medium], unique: true

索引的可能重复项为+1,但
唯一的可能重复项为-1,因为无法识别。对于这一部分,我使用了下面的答案。是的,对不起,验证键应该是
唯一性
,而不是
唯一性
。请参阅链接的文档。修正答案。嗯,很好,谢谢:)我重复一遍——在找到这个答案之前,把索引带到下一个层次,而不是像我遇到的其他“编码”解决方案那样+1表示该索引+1表示索引,但-1表示
唯一
,因为它无法识别。对于这一部分,我使用了下面的答案。是的,对不起,验证键应该是
唯一性
,而不是
唯一性
。请参阅链接的文档。修正答案。嗯,很好,谢谢:)我重复一遍——在找到这个答案之前,把索引带到下一个层次,而不是像我遇到的其他“编码”解决方案那样+1为that@DennisBest它“起作用”,但不能防止比赛条件。如果两个客户机同时发出请求,则在验证另一个之前,如果两个客户机都没有提交到数据库,则它们都可以通过验证。您还需要一个数据库唯一约束,如tompave的回答所示。@DennisBest它“起作用”,但它不能防止竞争条件。如果两个客户机同时发出请求,则在验证另一个之前,如果两个客户机都没有提交到数据库,则它们都可以通过验证。您还需要一个数据库唯一约束,如tompave的答案所示。