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



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

  1. 在第三方上创建用户

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

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

看起来我可以使用after_commit回调,但我如何在after_commit中识别该操作是createupdatedelete

这方面的任何帮助都会有所帮助。

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

  • 没有上下文——你实际上根本不知道应用程序中发生了什么
  • 很难控制回调何时真正启动——更重要的是,当您不希望它启动时(例如加载fixture时(
  • 这让模特承担了太多的责任
  • 您不能在创建/更新/销毁记录的同时测试回调逻辑

当您似乎也在处理第三方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

它们只做一项工作,很容易测试,只有当你明确希望它们启动时才会启动。ActiveJob实际上就是这种模式的一个例子。

相关内容

  • 没有找到相关文章

最新更新