跳过对模型创建的 ActiveSupport 关注

Skip ActiveSupport Concern on Model Create

问题陈述

我需要在模型上调用 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。我需要限制我的数据库中的总行数,这是我可以发挥最大影响的地方。

研究和尽职调查

我还没有看到任何其他问题来解决这个特定需求。

我知道有一种方法可以跳过回调

我不知道我是否可以使用适合我的情况的类似实用程序或代码行。

我尝试将 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)