2013-08-07 65 views
0

我有一个模型使用'active'标志来软删除项目而不是销毁它们。该模型具有“名称”属性,该属性在活动项目中必须是唯一的。我试图用conditions修改器与validates_uniqueness_of,但它似乎仍然检查活动和非活动项目的唯一性。我究竟做错了什么?Rails:validates_uniqueness_of条件不按预期工作

class Foo < ActiveRecord::Base 

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

end 
+0

做这样的事情唯一的问题是当你然后想重新激活一个不活动的Foo,但你不能,因为它将是无效的。 – sevenseacat

回答

2

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

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

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

我已证实,这部作品在Rails的3和4

1

这个工作对我来说:

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

如果范围从条件不同,你可以在这些条件中加入了条件,关键是唯一对象适用范围:

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

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