当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Rails:验证两列的唯一性(一起)》经验,为你挑选了3个好方法。

我有一个Release模型mediumcountry列(以及其他).不应该releases有相同medium/ country组合的共享.

我如何将其写为rails验证?



1> tompave..:

您可以使用选项使用唯一性验证scope.

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

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


是的,对不起,验证密钥应该是`uniqueness`,而不是`unique`.请参阅链接的文档.修复答案.

2> Aamir..:

以上所有答案都缺少如何验证模型中多个属性的唯一性.下面的代码旨在告诉如何在范围中使用多个属性.

validates :country, uniqueness: { scope: [:medium, :another_medium] }

它验证country值为medium和的所有行的唯一性another_medium.

注意:不要忘记在上面的列上添加索引,这可以确保快速检索并为唯一记录添加数据库级别验证.



3> K M Rakibul ..:

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

validates_uniqueness_of :medium, scope: :country

有关更多示例,请参阅文档.


@DennisBest它"有效",但它不能防止竞争条件.如果两个客户端同时发出请求,那么如果在验证另一个客户端之前没有提交任何请求,则它们都可以通过验证.您还需要一个数据库唯一约束,如tompave的答案.
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有