从模型中提取 after_commit 回调

Extract the after_commit callback from models

我正在尝试清理一些模型,同时使我的代码更具凝聚力,将所有可能触发特定服务的东西收集在一个地方。

我目前拥有的一些伪代码:

  any_commits_on User,
                 will_trigger: -> { CommonService.run!(self.id, :alive) },
                 if:           -> { self.some_association.alive? }

  any_commits_on User,
                 will_trigger: -> { CommonService.run!(self.id, :dead) },
                 if:           -> { self.whatever.dead? }

  any_commits_on Product,
                 will_trigger: -> { CommonService.run!(self.id) }

然后我有一个方法(它不起作用,但它是我想要实现的粗略表示):

  def any_commits_on(klass, **args)
    klass.after_commit { args[:will_trigger].call if args[:if]&.call || true }
  end

如何正确实施 #any_commits_on

None 我发现的 gems 提供了实现此目的的直接方法,但我也愿意接受其他建议。

最佳。

这最终奏效了:

  def any_commits_on(klass, **args)
    klass.after_commit args[:will_trigger], if: args[:if]
  end