2012-11-21 52 views
2

如何將下面的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 
+0

您好!你有沒有找到解決你的問題?我們遇到了同樣的問題,無法弄清楚要做什麼 – ka8725

回答

1

您可以設置使用一種稱爲wisper寶石的用戶和聽衆。

因此,在你PushService類,你將包括Wisper::Publisher有使用這個作爲服務GitHub的網頁上一個確切的例子。這樣,事件的解除將被照顧到實際的物體。

所以每當PushService做一些事情,需要更新連接瀏覽器

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

那麼該服務對象可以偵聽此事件與subscribe方法。

+0

https://github.com/krisleech/wisper/wiki/Command-Object – Kris

相關問題