使用Rails 3验证和/或回调,确保模型中只有一个记录的布尔值勾选为true,最简洁的方法是什么?我想将一条记录标记为当前活动的模型。使用Rails验证来限制到一个当前活动的模型
(我知道另一种选择是使用具有一对一的关联,但我很好奇,想知道如何更直接在模型记录保存这个。)
使用Rails 3验证和/或回调,确保模型中只有一个记录的布尔值勾选为true,最简洁的方法是什么?我想将一条记录标记为当前活动的模型。使用Rails验证来限制到一个当前活动的模型
(我知道另一种选择是使用具有一对一的关联,但我很好奇,想知道如何更直接在模型记录保存这个。)
如果所有你想做的事为验证它可以使用
validates_uniqueness_of :boolean_attribute, if: :boolean_attribute
刚落,在您的模型类。这将验证该模型只有一个boolean_attribute设置为true。
请注意,您将不得不解决将boolean_attribute从一个实例交换到另一个实例的原子性。
根据您正在使用的数据库,您可能能够使用事务来解决它。如果你的数据库不支持事务处理,你可能需要找出一个更好的方法来保证数据的一致性(比如我们有一个指向“活动”模型的专用模型,并删除boolean_attribute
,或者用一个整数代替boolean_attribute
原子增量(最高数字代表活动数字)
的回调很可能是最好的办法。喜欢的东西:
before_create :check_boolean
def check_boolean
Model.find_by_boolean_value(true).nil? ? true : false
end
如果check_boolean返回false,创建动作被取消(而不是find_by你也可以使用存在?这可能是有点更清晰编码)