Rails:验证两列的唯一性(一起)
Rails: validate uniqueness of two columns (together)
我有一个 Release
模型,其中包含 medium
和 country
列(以及其他列)。不应有 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
在所有具有 medium
和 another_medium
值的行中的唯一性。
注意:不要忘记在上面的列上添加索引,这可确保快速检索并为唯一记录添加数据库级别验证。
更新: 用于在创建时添加索引 table
t.index [:country, :medium, :another_medium], unique: true
我有一个 Release
模型,其中包含 medium
和 country
列(以及其他列)。不应有 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
在所有具有 medium
和 another_medium
值的行中的唯一性。
注意:不要忘记在上面的列上添加索引,这可确保快速检索并为唯一记录添加数据库级别验证。
更新: 用于在创建时添加索引 table
t.index [:country, :medium, :another_medium], unique: true