Rails:在 after_commit 中调用相同的方法来创建、更新、删除,但根据某些标志执行单独的操作

ope*_*per 1 ruby ruby-on-rails ruby-on-rails-5

我想根据以下场景在第三方服务上创建和删除用户

  1. 在第 3 方创建用户

    • 当在应用程序中创建用户时
    • 标记为active来自inactive(我的用户模型上有一个名为 的列is_active
  2. 删除第 3 方用户

    • 当用户从应用程序中删除时
    • 标记为inactive

看起来我可以利用after_commit回调,但是我如何在after_commit该操作中识别createupdate或者delete

对此的任何帮助都会有所帮助。

max*_*max 6

不要为此使用回调——你会后悔的。
回调的主要问题是:

  • 没有上下文——您实际上不知道应用程序中发生了什么。
  • 很难控制回调何时实际触发 - 更重要的是当您不希望它触发时(例如加载灯具时)。
  • 它给模型带来了太多的责任。
  • 您无法独立于创建/更新/销毁记录来测试回调逻辑。

当您似乎也在处理第三方 API 时,我真的不能低估这一点。当您触及应用程序边界时,使用回调等隐式机制是一个非常糟糕的主意。通过单一方法管理所有内容的整个想法也不合理。

相反,您可以使用服务对象等模式来处理模型的“转换”。

class UserCreationService
  def initialize(user)
    @user = user
  end

  def perform
    # do something with @user
  end
end


class UserInactivationService
  def initialize(user)
    @user = user
  end

  def perform
    # do something with @user
  end
end
Run Code Online (Sandbox Code Playgroud)

它们只执行一项工作,并且易于测试,并且只有在您明确希望它们执行时才会触发。ActiveJob 实际上就是这种模式的一个例子。