Rails after_save回调创建基于column_changed的关联模型?

时间:2009-03-31 17:51:18

标签: ruby-on-rails activerecord callback

我有一个带有状态列的ActiveRecord模型。当模型以状态更改保存时,我需要写入历史文件,更改状态以及由谁负责更改。我认为after_save回调会很好用,但我不能使用status_changed?用于确定执行历史写入的动态方法。如果保存模型但状态未更改,我不想写入历史记录。我现在处理它的唯一想法是使用实​​例变量标志来确定after_save是否应该执行。有什么想法吗?

4 个答案:

答案 0 :(得分:10)

自问题发布以来,这可能已经改变,但是after_save回调应该有*_changed?动态方法可用且设置正确:

class Order
  after_save :handle_status_changed, :if => :status_changed?
end

class Order
  after_save :handle_status_changed
  def handle_status_changed
    return unless status_changed?
    ...
  end
end

正确使用Rails 2.3.2。

答案 1 :(得分:6)

改为使用before_save回调。然后,您可以访问新旧状态值。回调包含在事务中,因此如果保存失败或被另一个回调取消,则历史写入也将回滚。

答案 2 :(得分:0)

我看到两个解决方案:

  1. 就像你说的那样:添加变量标志并在设置时运行回调。

  2. 更新记录后运行save_history。

  3. 示例:

    old_status = @record.status
    if @record.update\_attributes(params[:record])
      save_history_here if old_status != @record.status
      flash[:notice] = "Successful!"
      ...
    else
      ...
    end
    

答案 3 :(得分:-6)

有没有人听说过数据库触发器? 如果在数据库服务器上编写on_update数据库触发器,则每次更新记录时,它都会在关联的审计表中创建先前记录值的历史副本。

这是我对Rails鄙视的主要内容之一。它花了很多时间试图为开发人员做一切事情,这让开发人员误以为他们必须遵循这样粗俗的行为方式,就像编写专门的rails方法来做那些怪异的数据库服务器已经完全能够自己完成的事情。

再次震撼Rails