如何将以下 ActiveRecord::Observer 转换为 Service 对象(或者可能是多个对象)?
通过PushService
WebSocket 更新所有连接的浏览器的所有更改。它通过 POST 到外部进程来做到这一点。自从迁移Thread.new
到 Sidekiq 后,观察者就破产了。在 :after_create 中启动的 Sidekiq 作业可以在事务实际提交之前运行,因此它会引发 ActiveRecord::NotFound 错误。
建议使用 :after_commit 钩子,但是这样所需的信息PushService
将record.changes
不可用。
这个观察者实现的有趣用例是,当创建一条新消息时,它是对另一条消息的回复。它将自动运行两个回调。一个 :after_create 用于回复消息,一个 :after_touch 用于线程消息。
我有兴趣了解如何通过使用显式服务对象来运行此行为。
class PushObserver < ActiveRecord::Observer
observe :message
def after_create(record)
Rails.logger.info "[Observe] create #{record.inspect}"
PushService.new(:create, record).publish
end
def after_update(record)
Rails.logger.info "[Observe] update #{record.changed.inspect}"
PushService.new(:update, record).publish
end
def after_touch(record)
Rails.logger.info "[Observe] touched #{record.changes.inspect}"
PushService.new(:touch, record).publish
end
def after_destroy(record)
Rails.logger.info "[Observe] destroy #{record.inspect}"
PushService.new(:destroy, record).publish
end
end