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