【发布时间】:2016-03-29 04:59:53
【问题描述】:
我有一个 Release 模型,其中包含 medium 和 country 列(等等)。不应有 releases 共享相同的 medium/country 组合。
如何将其编写为 Rails 验证?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 activerecord rails-activerecord
我有一个 Release 模型,其中包含 medium 和 country 列(等等)。不应有 releases 共享相同的 medium/country 组合。
如何将其编写为 Rails 验证?
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 activerecord rails-activerecord
您可以将uniqueness 验证与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
【讨论】:
unique,因为它无法识别。对于那部分,我使用了下面的答案。
uniqueness,而不是unique。请参阅链接的文档。确定答案。
scope: 以检查两个以上字段的唯一性。
以上所有答案都缺少如何验证模型中多个属性的唯一性。下面的代码旨在说明如何在一个范围内使用多个属性。
validates :country, uniqueness: { scope: [:medium, :another_medium] }
它验证 country 在所有值为 medium 和 another_medium 的行中的唯一性。
注意:不要忘记在上面的列上添加索引,这样可以确保快速检索并为唯一记录添加数据库级别的验证。
更新:用于在创建表时添加索引
t.index [:medium, :another_medium], unique: true
【讨论】:
【讨论】: