Rails:validates_uniqueness_of条件不按预期工作

时间:2013-08-07 12:02:32

标签: ruby-on-rails validation activerecord

我有一个使用“活跃”模型的模型。标记为软删除项而不是销毁它们。该模型有一个名称' property,在活动项目中必须是唯一的。我试图将conditions修饰符与validates_uniqueness_of一起使用,但它似乎仍在检查活动和非活动项目的唯一性。我做错了什么?

class Foo < ActiveRecord::Base

  attr_accessible :name, :active
  validates_uniqueness_of :name, conditions: -> { where(active:true) }

end

3 个答案:

答案 0 :(得分:2)

您可以结合使用scopeif修饰符:

scope :active, where(:active => true)
validates :name, :uniqueness => {:message => 'That name is in use', :if => :active?, :scope => :active}

这将仅导致活动的项目触发验证,并且验证将仅考虑活动项目中的唯一性。

我已经确认这适用于Rails 3和4。

答案 1 :(得分:2)

如果范围与条件不同,您可以通过向唯一性对象添加条件键来在这些条件中应用范围:

scope :active, -> { where(active: true) }

validates :active, uniqueness: {
  scope: :name,
  message: 'name is in use',
  conditions: -> { active }
}

答案 2 :(得分:1)

这对我有用:

validates :active, :uniqueness => { :scope => :name, :message => 'name is in use'}, :if => :active