次の ActiveRecord::Observer を Service オブジェクト (または複数のオブジェクト) に変換するにはどうすればよいでしょうか?
すべてのPushService
変更の WebSocket を介して、接続されているすべてのブラウザーを更新します。これは、外部プロセスへの POST によって行われます。Thread.new
からSidekiq に移行してから、オブザーバーが壊れました。:after_create で開始された Sidekiq ジョブは、トランザクションが実際にコミットされる前に実行される可能性があるため、ActiveRecord::NotFound エラーが発生します。
:after_commit フックを使用することをお勧めしますが、そうすると必要な情報PushService
がrecord.changes
利用できなくなります。
このオブザーバーが実現する興味深い使用例は、別のメッセージへの返信である新しいメッセージが作成されたときです。2 つのコールバックが自動的に実行されます。返信メッセージ用の :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