2013-08-07 70 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 } 
}