结合保存,所以after_update只调用一次

时间:2012-03-31 22:54:52

标签: ruby-on-rails transactions callback save

我发现我的Projelement after_update回调触发了两次,因为我保存了Projelement两次(previous question):

def update    
  @milestone = Milestone.find(params[:id])

  respond_to do |format|
    if @milestone.update_attributes(params[:milestone])

      # flag that current_user has this milestone
      @milestone.read_by.clear
      @milestone.read_by << current_user
      @milestone.save

    ...
    end
  end
end

所以我想做两件事:

  1. 保存并验证Projelement的属性
  2. 标记Projelement以标记当前用户已阅读
  3. 将它们分开会创建两个after_update回调调用,这不是我想要的。

    最好的方法是使after_update只触发一次?

1 个答案:

答案 0 :(得分:3)

最干净的解决方案是进行单次保存/更新并让模型担心分配read_by,这样:

控制器代码

@milestone = Milestone.find(params[:id])
@milestone.attributes = params[:milestone]
@milestone.set_read_by(current_user) 

# the .save will be the only db transaction
if @milestone.save 
  #... 
else 
  #...
end

milstone.rb(型号)代码

def set_read_by(user)
  read_by.clear
  read_by << user
end