6

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

4

4 回答 4

11

自问题发布以来,这可能已经改变,但 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 对我来说可以正常工作。

于 2009-11-10T18:02:43.647 回答
6

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

于 2009-04-06T08:04:32.897 回答
0

我看到两个解决方案:

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

  2. 更新记录后运行 save_history。

例子:

old_status = @record.status
if @record.update\_attributes(params[:record])
  save_history_here if old_status != @record.status
  flash[:notice] = "Successful!"
  ...
else
  ...
end
于 2009-04-01T15:11:50.733 回答
-7

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

这是我鄙视 Rails 的主要方面之一。它花费大量时间试图为开发人员做所有事情,以至于让开发人员误以为他们必须遵循诸如编写专门的 Rails 方法之类的粗俗做法来完成该死的数据库服务器已经完全能够自己完成的所有事情。

再次对 Rails 摇头

于 2012-03-29T17:41:14.107 回答