3

我正在使用 state_machine 来转换我的一个模型中的状态。转换成功地发生在单个记录上。但是如果我必须在多条记录上触发一个事件该怎么办。我可以在多条记录中进行转换

     @records.each &:event

但是此方法执行查询的次数与@records. 如何触发事件以仅通过一个查询进行状态转换。请帮忙。

谢谢。

4

1 回答 1

0

在 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 答案中所述,这会将这些事务包装为一个原子操作。

注意:可能存在这无法解决的错误处理边缘情况。

于 2014-03-14T18:53:04.697 回答