ecto-如何从一个表相对于另一个表异步更新一批记录

时间:2019-06-17 08:46:21

标签: elixir phoenix-framework ecto

我有两个表:assignmentsreports。生成报告以保留分配的统计信息。因此,每次创建或更新任务时,所有报告都必须被任意更新。我做这样的事情:

Multi.new()
|> Multi.insert(:assignment, assignment_changeset(params))
|> Multi.update(:update_reports, update_all_reports())

现在,每当我创建或更新任务时,这都会对服务器造成巨大的损失,因为要更新的报告太多。因此,我遇到了超时问题,因此暂时禁用了报告更新。现在,我想知道是否有更好的方法来批量更新报告而不中断分配操作。

1 个答案:

答案 0 :(得分:1)

我确定您有充分的理由更新所有报告,即使我认为由于服务器上的负载而应修改该实现。 我为您提供的解决方案仅解决您所说的超时问题。

您可以将所有内容包装在生成中:

spawn(fn -> 
  Multi.new()
  |> Multi.insert(:assignment, assignment_changeset(params))
  |> Multi.update(:update_reports, update_all_reports())
end)

它将创建另一个将在其上进行创建/更新的过程,而请求过程则可以继续进行。 请记住,只有在不需要操作结果的情况下,此方法才有效,否则应考虑使用回调来获取结果。