如何将Wisper与同一活动记录模型的不同实例一起使用?

时间:2015-06-24 13:52:34

标签: activerecord wisper

我试图将Wisper与Rails 4 / AR一起使用并遇到问题。

我们说我有EmailCreep AR模型,我希望Creep知道何时收到回复(Creep不一定发件人......)

所以我这样做:

email = Email.create! params
creep = Creep.last
email.subscribe(creep, on: :reply_received, with: :success)

如果立即执行:

email.publish :reply_received

它将起作用(Creep实例有成功方法。)

但是,如果我以后再做:

email = Email.find(id)

或:

email = Email.last

该活动未播出。我猜这是因为新电子邮件是一个不同的实例,因此没有订阅听众。我做错了什么?

1 个答案:

答案 0 :(得分:1)

你是对的。使用email.subscribe您正在将侦听器订阅到单个对象。执行Email.find后,您将获得另一个email对象(请检查email.object_id)。

您可以为新返回的对象订阅creep

email = Email.find(id)
email.subscribe(Creep.last)

或者您可以creep订阅Email这样的所有实例:

 Email.subscribe(Creep.last)

您可能会想要在初始化程序中执行上述操作,因此只会发生一次。

然而,这可能是一个问题,因为您似乎想要订阅Creep.last,这将随着时间的推移而改变。在这种情况下,你可以做一些像这样的事情:

class CreepListener
  def success(*args)
    Creep.last.success(*args)
  end
end

Email.subscribe(CreepListener.new)