Как использовать 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)