3

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

class Foo < ActiveRecord::Base

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

end
4

4 回答 4

5

为此,您可以结合使用scopeand修饰符:if

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

这将导致只有处于活动状态的项目才会触发验证,并且验证将仅考虑处于活动状态的项目之间的唯一性。

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

于 2013-08-07T12:10:53.150 回答
4

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

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

validates :active, uniqueness: {
  scope: :name,
  message: 'name is in use',
  conditions: -> { active }
}
于 2016-12-26T12:25:56.760 回答
1

这对我有用:

validates :active, :uniqueness => { :scope => :name, :message => 'name is in use'}, :if => :active
于 2013-08-07T12:06:56.227 回答
0

这对我有用——</p>

validates_uniqueness_of :asset_id, scope: :source,
                        conditions: -> { where.not(source: :azure) },
                        :allow_nil => true, :allow_blank => true,
                        message: "has already been taken with this source." 
于 2021-08-16T10:09:02.250 回答