Подтвердить что ты не робот

Rails - ActiveRecord - запуск почты при изменении значения поля

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

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

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

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

4b9b3361

Ответ 1

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 вернет старое значение поля имени.

UPDATE:

Чтобы отправить электронное письмо только при первом переключении поля с ложного на значение 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