Ruby on rails RubyonRails——事务是否使用嵌套对象?

Ruby on rails RubyonRails——事务是否使用嵌套对象?,ruby-on-rails,activerecord,nested,query-optimization,Ruby On Rails,Activerecord,Nested,Query Optimization,我的程序正在处理一个深嵌套对象。 以下是此嵌套模型的图示: ParentObject有许多ChildObject1~30条记录 ChildObject1有许多ChildObject2~40条记录 ChildObject2有许多ChildObject3~15 记录 ChildObject2有许多ChildObject4~10条记录 为了有一个高效的应用程序,我决定拆分用于记录此数据的表单(每个childObject1一个表单)。我还使用缓存,然后每次更新ChildObject2、3、4时都需要

我的程序正在处理一个深嵌套对象。 以下是此嵌套模型的图示:

  • ParentObject有许多ChildObject1~30条记录
  • ChildObject1有许多ChildObject2~40条记录
  • ChildObject2有许多ChildObject3~15 记录
  • ChildObject2有许多ChildObject4~10条记录
为了有一个高效的应用程序,我决定拆分用于记录此数据的表单(每个childObject1一个表单)。我还使用缓存,然后每次更新ChildObject2、3、4时都需要更新ChildObject1的“updated_at”字段。因此,每个childObject“属于”关系的“触摸”选项都设置为true

然后,对于一个小型服务器,性能并没有那么差(保存数据最多1s)

但一旦所有内容都被记录下来,我还需要用all is childObjects复制parentObject。 复制它并构建相同的parentObject没有问题,但是当我保存对象时,事务非常长

我查看了服务器日志,发现对象是一个接一个地插入的。我还看到,在每次插入之后,父级“updated_at”字段都会更新(由于“touch:true”选项)。 它导致30000次插入60000次更新,90000次在数据库中写入查询(每个对象可以有3到6个字段…)

通常,“save”方法本机使用ActiveRecord::Base.transaction。 在这里它没有发生。 我试图删除“touch:true”选项,它完全相同,插入是一个接一个地完成的

因此,我的问题是:

  • 我认为事务可以应用于嵌套对象,比如explain,我是不是误解了什么
  • 这是一个不应该通过ActiveRecord执行的操作的示例吗
  • 是否可以只使用“touch:true”选项对父对象进行最后一次更新?(已解决:请参阅下面的答案)
  • 通常,一次在数据库中写入90000行是一项艰巨的工作吗?可能puma服务器或pg DB只是配置错误

提前谢谢你的帮助。如果没有解决方案,我将在晚上自动完成这项工作…

我用

该gem在批处理结束时延迟了“touch”更新。用这个更干净


但我在交易方面仍然有问题。我仍然不知道是否可以在一个查询中为每个表插入所有数据

我用

该gem在批处理结束时延迟了“touch”更新。用这个更干净

但我在交易方面仍然有问题。我仍然不知道是否可以在一个查询中为每个表插入所有数据