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

6 activerecord ruby-on-rails callback

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

Jor*_*ugh 10

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

class Order
  after_save :handle_status_changed, :if => :status_changed?
end
Run Code Online (Sandbox Code Playgroud)

要么

class Order
  after_save :handle_status_changed
  def handle_status_changed
    return unless status_changed?
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

适用于我的Rails 2.3.2.


And*_*att 6

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


kle*_*lew 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
Run Code Online (Sandbox Code Playgroud)