2012-03-17 29 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你也可以使用存在?这可能是有点更清晰编码)