跳过对模型创建的 ActiveSupport 关注
Skip ActiveSupport Concern on Model Create
问题陈述
我需要在模型上调用 create
,并跳过该模型定义中包含的许多问题之一。
要求
- 无法更改模型、任何控制器或问题本身
- 无法跳过所有
after_create
个回调
- 无法等待延迟的作业队列
代码示例
型号
class Team < ApplicationRecord
include SomeConcernINeed
include SomeConcernIDontNeed
include AnotherConcernINeed
belongs_to :organization
...
# etc
关注
module SomeConcernIDontNeed
extend ActiveSupport::Concern
included do
after_create :call_some_service
def call_some_service
::SomeServiceCallINeed.perform_later(self)
end
...
# etc
我的代码
Team.find_or_create_by!(name: "Foo") do |team|
# need to skip concern here
end
为什么
我不是 rails 开发人员,而是软件测试人员。我正在创建一个 rake 任务来为自动化测试播种 heroku 评论应用程序。
我正在使用一个大型遗留代码库,不允许也不建议我对其进行任何更改,因为应用程序的逻辑耦合度和嵌套度非常高。
我是 运行 的 rake 任务在 heroku 部署的发布阶段创建记录,其中许多模型依赖于其他表,或者在 perform_later
服务上创建依赖记录打电话。
因为在发布阶段工作人员还没有起来运行,而且我不能指望稍后在脚本中由关注点创建我需要的依赖记录,所以我调用了一些手动服务。例如。一个团队需要一个用户,而这个用户需要一个有很多问题的应用程序。
问题是在发布阶段之后,服务器启动,工作人员开始处理所有延迟的作业,这些作业由我刚刚播种的 1000 多条记录排队。这对某些作业来说很好,因为它们调用的服务是幂等的。但特别是创建 1300 重复 记录。
使用所有评论应用程序标配的 heroku-postgresql:hobby-dev 计划,在撤销写入权限之前,我在数据库中的行数被限制为 10k。我需要限制我的数据库中的总行数,这是我可以发挥最大影响的地方。
研究和尽职调查
我还没有看到任何其他问题来解决这个特定需求。
我知道有一种方法可以跳过回调
- 例如
Team.skip_callbacks(:after_create)
但这将否定我仍然需要的其他 after_create
回调(我认为)。
我不知道我是否可以使用适合我的情况的类似实用程序或代码行。
我尝试将 rake 任务移动到 app.json
配置中的 postdeploy
脚本,但由于我可支配的计算资源有限,delayed_job 队列随一次敲击的绝对音量。
我试图减少我的种子,但我必须模拟现有测试套件 运行 反对的预先存在的数据。由于数据库的大小,我无法将数据库复制到评论应用程序。
跳过 ActiveSupport:Concern 回调与跳过直接在模型中的回调本质上没有什么不同。关注名称并不重要,因为根据代码,这一切都在一次执行中发生。
因此,您可以直接访问回调方法,因此只需在创建记录之前按名称跳过回调即可。
Team.skip_callback(:create, :after, :call_some_service)
Team.create()
确保之后通过再次设置回调进行清理,以便将来的记录仍然使用回调。
Team.set_callback(:create, :after, :call_some_service)
问题陈述
我需要在模型上调用 create
,并跳过该模型定义中包含的许多问题之一。
要求
- 无法更改模型、任何控制器或问题本身
- 无法跳过所有
after_create
个回调 - 无法等待延迟的作业队列
代码示例
型号
class Team < ApplicationRecord
include SomeConcernINeed
include SomeConcernIDontNeed
include AnotherConcernINeed
belongs_to :organization
...
# etc
关注
module SomeConcernIDontNeed
extend ActiveSupport::Concern
included do
after_create :call_some_service
def call_some_service
::SomeServiceCallINeed.perform_later(self)
end
...
# etc
我的代码
Team.find_or_create_by!(name: "Foo") do |team|
# need to skip concern here
end
为什么
我不是 rails 开发人员,而是软件测试人员。我正在创建一个 rake 任务来为自动化测试播种 heroku 评论应用程序。
我正在使用一个大型遗留代码库,不允许也不建议我对其进行任何更改,因为应用程序的逻辑耦合度和嵌套度非常高。
我是 运行 的 rake 任务在 heroku 部署的发布阶段创建记录,其中许多模型依赖于其他表,或者在 perform_later
服务上创建依赖记录打电话。
因为在发布阶段工作人员还没有起来运行,而且我不能指望稍后在脚本中由关注点创建我需要的依赖记录,所以我调用了一些手动服务。例如。一个团队需要一个用户,而这个用户需要一个有很多问题的应用程序。
问题是在发布阶段之后,服务器启动,工作人员开始处理所有延迟的作业,这些作业由我刚刚播种的 1000 多条记录排队。这对某些作业来说很好,因为它们调用的服务是幂等的。但特别是创建 1300 重复 记录。
使用所有评论应用程序标配的 heroku-postgresql:hobby-dev 计划,在撤销写入权限之前,我在数据库中的行数被限制为 10k。我需要限制我的数据库中的总行数,这是我可以发挥最大影响的地方。
研究和尽职调查
我还没有看到任何其他问题来解决这个特定需求。
我知道有一种方法可以跳过回调
- 例如
Team.skip_callbacks(:after_create)
但这将否定我仍然需要的其他after_create
回调(我认为)。
我不知道我是否可以使用适合我的情况的类似实用程序或代码行。
我尝试将 rake 任务移动到 app.json
配置中的 postdeploy
脚本,但由于我可支配的计算资源有限,delayed_job 队列随一次敲击的绝对音量。
我试图减少我的种子,但我必须模拟现有测试套件 运行 反对的预先存在的数据。由于数据库的大小,我无法将数据库复制到评论应用程序。
跳过 ActiveSupport:Concern 回调与跳过直接在模型中的回调本质上没有什么不同。关注名称并不重要,因为根据代码,这一切都在一次执行中发生。
因此,您可以直接访问回调方法,因此只需在创建记录之前按名称跳过回调即可。
Team.skip_callback(:create, :after, :call_some_service)
Team.create()
确保之后通过再次设置回调进行清理,以便将来的记录仍然使用回调。
Team.set_callback(:create, :after, :call_some_service)