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

Rails: validate uniqueness of two columns (together)

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

如何将其写成 rails 验证?

您可以像这样将 :scope 参数传递给您的验证器:

validates_uniqueness_of :medium, scope: :country

有关更多示例,请参阅 documentation

您可以使用带有 scope 选项的 uniqueness 验证。

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

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 值的行中的唯一性。

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

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

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