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

我有一个 Release模型与 mediumcountry列(其中)。不应该有 releases共享相同的 medium/country组合。

我该如何编写这个来作为 Rails 验证?

96885 次浏览

您可以像下面这样向验证器传递 :scope参数:

validates_uniqueness_of :medium, scope: :country

有关更多示例,请参见 文件

可以使用 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在所有值为 mediumanother_medium的行中的唯一性。

注意: 不要忘记在上面的列中添加一个索引,这样可以确保快速检索,并为唯一记录添加一个 DB 级验证。

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

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