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