Как использовать Wisper с разными экземплярами одной и той же модели Active Record?

Я пытаюсь использовать Wisper с Rails 4 / AR и сталкиваюсь с проблемой.

Допустим, у меня есть Email а также Creep Модели 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 ответ

Ты прав. С помощью 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)
Другие вопросы по тегам