Rails - ActiveRecord - 触发更改字段值的邮件

时间:2011-10-11 17:11:27

标签: ruby-on-rails activerecord

我正在开发一项功能,我需要在记录字段值成功更新后触发邮件到用户列表。

例如:我有一个Blog模型,它具有已发布的属性(表示我的数据库表中的一列),默认值为false。当用户发布博客时,字段值将变为true,我需要发送一些邮件。

  1. 哪种方式最好?
  2. 如果我可以使用after_update回调,我将如何知道在上次更新通话期间已发布的列已更新?
  3. 更新后有没有办法访问已发布属性的旧值?
  4. 非常感谢任何帮助...

1 个答案:

答案 0 :(得分:29)

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将返回name字段的旧值。

<强>更新

要在第一次将字段从false切换为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