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

时间:2015-12-22 20:44:45

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 activerecord rails-activerecord

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

我如何将其写为rails验证?

3 个答案:

答案 0 :(得分:161)

您可以使用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

答案 1 :(得分:45)

以上所有答案都缺少如何验证模型中多个属性的唯一性。下面的代码旨在告诉您如何在范围中使用多个属性。

validates :country, uniqueness: { scope: [:medium, :another_medium] }

它验证值countrymedium的所有行中another_medium的唯一性。

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

答案 2 :(得分:29)

您可以将:scope参数传递给验证器,如下所示:

validates_uniqueness_of :medium, scope: :country

有关更多示例,请参阅documentation