Rails:在 after_commit 中调用相同的方法进行创建、更新、删除,但根据某些标志做不同的事情
Rails: call same method in after_commit for create, update, delete but do separate things based on certain flags
我想根据以下场景在第 3 方服务上创建和删除用户
在第 3 方创建用户
- 在应用程序中创建用户时
- 从
inactive
标记为 active
(我的用户模型中有一列名为 is_active
)
删除第 3 方用户
- 当用户从应用程序中删除时
- 标记为
inactive
看起来我可以使用 after_commit
回调,但我如何在 after_commit
中识别该操作是 create
、update
或 delete
对此的任何帮助都会有所帮助。
不要为此使用回调——你会后悔的。
回调的主要问题是:
- 没有上下文——您实际上不知道应用程序中发生了什么。
- 很难控制回调何时真正触发——更重要的是当你不希望它触发时(例如加载固定装置时)。
- 它把太多的责任推给了模型。
- 您无法独立于 creating/updating/destroying 记录测试回调逻辑。
当你似乎也在与第三方打交道时,我真的不能低估这一点 API。当您触及应用程序边界时使用回调之类的隐式机制是一个非常糟糕的主意。通过单一方法管道一切的整个想法也不合理。
相反,您可以使用 service objects 等模式来处理模型的“转换”。
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 实际上就是这种模式的一个例子。
我想根据以下场景在第 3 方服务上创建和删除用户
在第 3 方创建用户
- 在应用程序中创建用户时
- 从
inactive
标记为active
(我的用户模型中有一列名为is_active
)
删除第 3 方用户
- 当用户从应用程序中删除时
- 标记为
inactive
看起来我可以使用 after_commit
回调,但我如何在 after_commit
中识别该操作是 create
、update
或 delete
对此的任何帮助都会有所帮助。
不要为此使用回调——你会后悔的。
回调的主要问题是:
- 没有上下文——您实际上不知道应用程序中发生了什么。
- 很难控制回调何时真正触发——更重要的是当你不希望它触发时(例如加载固定装置时)。
- 它把太多的责任推给了模型。
- 您无法独立于 creating/updating/destroying 记录测试回调逻辑。
当你似乎也在与第三方打交道时,我真的不能低估这一点 API。当您触及应用程序边界时使用回调之类的隐式机制是一个非常糟糕的主意。通过单一方法管道一切的整个想法也不合理。
相反,您可以使用 service objects 等模式来处理模型的“转换”。
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 实际上就是这种模式的一个例子。