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的答案所示。