我有一个 Release模型与 medium和 country列(其中)。不应该有 releases共享相同的 medium/country组合。
Release
medium
country
releases
我该如何编写这个来作为 Rails 验证?
您可以像下面这样向验证器传递 :scope参数:
:scope
validates_uniqueness_of :medium, scope: :country
有关更多示例,请参见 文件。
可以使用 scope选项进行 独一无二验证。
scope
此外,您应该向 DB 添加一个唯一的索引,以防止在编写之前同时检查新记录时通过验证:
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
上述所有答案都缺少如何验证模型中多个属性的唯一性。下面的代码将告诉您如何在一个范围中使用多个属性。
validates :country, uniqueness: { scope: [:medium, :another_medium] }
它验证 country在所有值为 medium和 another_medium的行中的唯一性。
another_medium
注意: 不要忘记在上面的列中添加一个索引,这样可以确保快速检索,并为唯一记录添加一个 DB 级验证。
更新: 用于在创建表时添加索引
t.index [:country, :medium, :another_medium], unique: true