如何在before_update上反映进程?
How to reflect process on before_update?
我有一个项目,当我尝试更新某些属性时,会运行一个冗长且令人筋疲力尽的 before_update 函数。此函数运行一些脚本,当它们成功完成时,属性会更改。
问题是我想要一种方法来反映当前 运行 脚本的当前状态(以显示某种 2/5...3/5... 过程),但我想不出解决办法。我尝试将最后一个 运行 命令保存在数据库中,但是因为脚本是 运行 在 before_update 范围内,所以提交仅在所有脚本完成后完成。
这种问题有什么优雅的解决方案吗?
一般来说,您应该避免 运行在回调中使用昂贵的横切代码。总有一天您会想要更新其中一条记录而不使用 运行 那个代码,然后您将开始添加标志以确定该回调应该 运行 的时间,以及各种其他麻烦。此外,如果在请求期间更新记录,昂贵的回调代码将减慢整个请求,并可能超时 and/or 阻止其他访问者访问您的应用程序。
构建此方法的方法是首先创建记录(可能使用 flag/state 告诉应用程序的其余部分更新尚未 "processed" - 这意味着相关当前在您的回调中的代码还没有 运行)。然后,您将执行回调中的任何操作的后台作业排队。如果您使用的是 Sidekiq,则可以使用 sidekiq-status gem 来更新作业的状态,因为它是 运行ning。
然后您将添加一个 controller/action 来检查作业的状态,并在 JSON 中添加 returns 它,并且一些 JS 每隔几秒就会执行一次该操作以进行检查工作状态并相应地更新您的界面。
即使您不想让您的用户了解作业的最新状态,后台作业也可能仍然是有序的 - 特别是如果该代码非常昂贵,或涉及第三方 API 电话。如果不是,它可能属于控制器,您可以 运行 将其全部放在一个事务中。但是,如果您需要让您的用户了解该工作的最新状态,后台工作是您的不二之选。
我有一个项目,当我尝试更新某些属性时,会运行一个冗长且令人筋疲力尽的 before_update 函数。此函数运行一些脚本,当它们成功完成时,属性会更改。
问题是我想要一种方法来反映当前 运行 脚本的当前状态(以显示某种 2/5...3/5... 过程),但我想不出解决办法。我尝试将最后一个 运行 命令保存在数据库中,但是因为脚本是 运行 在 before_update 范围内,所以提交仅在所有脚本完成后完成。
这种问题有什么优雅的解决方案吗?
一般来说,您应该避免 运行在回调中使用昂贵的横切代码。总有一天您会想要更新其中一条记录而不使用 运行 那个代码,然后您将开始添加标志以确定该回调应该 运行 的时间,以及各种其他麻烦。此外,如果在请求期间更新记录,昂贵的回调代码将减慢整个请求,并可能超时 and/or 阻止其他访问者访问您的应用程序。
构建此方法的方法是首先创建记录(可能使用 flag/state 告诉应用程序的其余部分更新尚未 "processed" - 这意味着相关当前在您的回调中的代码还没有 运行)。然后,您将执行回调中的任何操作的后台作业排队。如果您使用的是 Sidekiq,则可以使用 sidekiq-status gem 来更新作业的状态,因为它是 运行ning。
然后您将添加一个 controller/action 来检查作业的状态,并在 JSON 中添加 returns 它,并且一些 JS 每隔几秒就会执行一次该操作以进行检查工作状态并相应地更新您的界面。
即使您不想让您的用户了解作业的最新状态,后台作业也可能仍然是有序的 - 特别是如果该代码非常昂贵,或涉及第三方 API 电话。如果不是,它可能属于控制器,您可以 运行 将其全部放在一个事务中。但是,如果您需要让您的用户了解该工作的最新状态,后台工作是您的不二之选。