如何将此ActiveRecord :: Observer转换为Service对象?

如何将下面的ActiveRecord :: Observer转换为Service对象(或者可能是多个对象)?

PushService通过所有更改的WebSocket更新所有连接的浏览器。 它通过发布到外部进程来完成此操作。 从Thread.new迁移到Sidekiq后,观察者破裂了。 一个Sidekiq作业开始于:after_create可以在事务实际提交之前运行,因此会引发ActiveRecord :: NotFound错误。

建议使用:after_commit挂钩,但是PushService所需的信息(如record.changes将不可用。

这个观察者满足的有趣用例是当一个新消息被创建时,它是对另一个消息的回复。 它会自动运行两个回调。 An:应答消息的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

您可以使用称为wisper的gem来设置订阅者和听众。

因此,在您的PushService类中,您将包含Wisper::Publisher 。在Github页面上有一个确切的示例,将其用作服务。 这样,事件的解除将被照顾到实际的物体。

所以每当PushService执行某些操作时需要更新连接的浏览器

def some_action
  #some code
  publish(:done_something, self)
end

然后,服务对象可以使用subscribe方法来侦听此事件。

链接地址: http://www.djcxy.com/p/66231.html

上一篇: How to convert this ActiveRecord::Observer to a Service object?

下一篇: attributes without save?