我有一个带有状态列的ActiveRecord模型。当模型以状态更改保存时,我需要写入历史文件,更改状态以及由谁负责更改。我认为after_save回调会很好用,但我不能使用status_changed?用于确定执行历史写入的动态方法。如果保存模型但状态未更改,我不想写入历史记录。我现在处理它的唯一想法是使用实例变量标志来确定after_save是否应该执行。有什么想法吗?
答案 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)
我看到两个解决方案:
就像你说的那样:添加变量标志并在设置时运行回调。
更新记录后运行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
答案 3 :(得分:-6)
有没有人听说过数据库触发器? 如果在数据库服务器上编写on_update数据库触发器,则每次更新记录时,它都会在关联的审计表中创建先前记录值的历史副本。
这是我对Rails鄙视的主要内容之一。它花了很多时间试图为开发人员做一切事情,这让开发人员误以为他们必须遵循这样粗俗的行为方式,就像编写专门的rails方法来做那些怪异的数据库服务器已经完全能够自己完成的事情。
再次震撼Rails