2012-03-17 28 views
0

使用Rails 3驗證和/或回調,確保模型中只有一個記錄的布爾值勾選爲true,最簡潔的方法是什麼?我想將一條記錄標記爲當前活動的模型。使用Rails驗證來限制到一個當前活動的模型

(我知道另一種選擇是使用具有一對一的關聯,但我很好奇,想知道如何更直接在模型記錄保存這個。)

回答

3

如果所有你想做的事爲驗證它可以使用

validates_uniqueness_of :boolean_attribute, if: :boolean_attribute 

剛落,在您的模型類。這將驗證該模型只有一個boolean_attribute設置爲true。

請注意,您將不得不解決將boolean_attribute從一個實例交換到另一個實例的原子性。

根據您正在使用的數據庫,您可能能夠使用事務來解決它。如果你的數據庫不支持事務處理,你可能需要找出一個更好的方法來保證數據的一致性(比如我們有一個指向「活動」模型的專用模型,並刪除boolean_attribute,或者用一個整數代替boolean_attribute原子增量(最高數字代表活動數字)

2

的回調很可能是最好的辦法。喜歡的東西:

before_create :check_boolean 

def check_boolean 
    Model.find_by_boolean_value(true).nil? ? true : false 
end 

如果check_boolean返回false,創建動作被取消(而不是find_by你也可以使用存在?這可能是有點更清晰編碼)