Ответ 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