使用Rails验证限制为一个当前活动的模型

时间:2012-03-17 18:10:27

标签: ruby-on-rails

使用Rails 3验证和/或回调,确保只有一个模型记录的布尔值标记为真的最简洁的方法是什么?我想将一条记录标记为当前活动模型。

(我知道另一种选择是使用has-one关联,但我很想知道如何更直接地将它存储在模型记录中。)

2 个答案:

答案 0 :(得分:3)

如果您只想验证它,可以使用

validates_uniqueness_of :boolean_attribute, if: :boolean_attribute

将其放入模型类中。这将验证模型只有一个boolean_attribute设置为true。

请注意,您必须解决将boolean_attribute从一个实例交换到另一个实例的原子性。

根据您使用的数据库,您可以使用事务解决它。如果您的数据库不支持事务,您可能需要找到一种更好的方法来保证数据的一致性(例如,我们有一个指向“活动”模型的专用模型,并完全删除boolean_attribute或替换{{1带有一个可以原子递增的整数(代表活动数字的最大数字)。

答案 1 :(得分:2)

回调可能是最好的方法。类似的东西:

before_create :check_boolean

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

如果check_boolean返回false,则取消create动作(而不是find_by,你也可以使用exists?,这可能是一个更清晰的编码)