Rails - ActiveRecord - запускает почту при изменении значения поля - PullRequest
12 голосов
/ 11 октября 2011

Я работаю над функционалом, в котором мне нужно вызвать почту для списка пользователей после успешного обновления значения поля записи.

Например: у меня есть модель блога, у которой есть опубликованный атрибут (представляет столбец в моей таблице базы данных) со значением по умолчанию как false.Когда пользователь опубликовал блог, значение поля станет истинным, и мне нужно отправить несколько писем.

  1. Какой лучший способ сделать это?
  2. Если я могу использовать after_updateобратный вызов, как я узнаю, что опубликованный столбец был обновлен во время последнего вызова обновления?
  3. Есть ли способ получить доступ к старому значению опубликованного атрибута после обновления?

Любая помощь высоко ценится ...

1 Ответ

29 голосов
/ 11 октября 2011

1) может быть немного субъективно, но я отвечу, что наряду с 2) ActiveRecord предоставляет методы, чтобы указать, изменился ли атрибут.Вы можете использовать имя атрибута + _changed?.Например, если ваша модель имеет атрибут name, она также будет реагировать на #name_changed? Вот один способ отправки электронной почты, только если атрибут был изменен:

class MyModel
  after_update :send_email, :if => :column_name_changed?

  def send_email
    # Send email here
  end
end

3) Старый атрибутзначение можно получить, добавив _was.Например, #name_was вернет старое значение поля имени.

ОБНОВЛЕНИЕ:

Чтобы отправить электронное письмо только при первом переключении поля с ложного наtrue вам нужно будет добавить еще одно поле в вашу базу данных, например email_sent.Поскольку условие для обратного вызова send_email стало более сложным, я переместил его в сам обратный вызов.После того, как электронное письмо отправлено, установите для поля email_sent значение true, чтобы дальнейшие электронные письма не доставлялись.

class MyModel
  after_update :send_email

  def send_email
    if column_name_changed? && !email_sent?
      # Send email here
      update_attribute :email_sent, true
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...