使用Rails 3验证和/或回调,确保只有一个模型记录的布尔值标记为真的最简洁的方法是什么?我想将一条记录标记为当前活动模型。
(我知道另一种选择是使用has-one关联,但我很想知道如何更直接地将它存储在模型记录中。)
答案 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?,这可能是一个更清晰的编码)