我正在使用state_machine来转换我的一个模型中的状态。转换成功地发生在单个记录上。但是,如果我必须在多个记录上触发一个事件,该怎么办。我可以用在多个记录中进行转换
@records.each &:event
但该方法执行查询的次数与@records
的次数一样多。如何通过一个查询触发事件来进行状态转换。请帮忙。
谢谢。
在Rails(4)中,这可以使用B#transaction
(或B#save
)来实现,如SO中所述:保存活动记录数组。
我对在200条记录上运行一个简单的state_machine事件进行了基准测试,结果如下所示。
代替:
@records.each &:event
# Completed 302 Found in 1700ms (ActiveRecord: 778.6ms)
do:
ActiveRecord::Base.transaction do
@records.each &:event
end
# Completed 302 Found in 977ms (ActiveRecord: 73.4ms)
正如前面链接的SO回答中所指出的,这将把这些事务封装为一个原子操作。
注意:可能存在无法解决的错误处理边缘情况。