2012-03-31 4 views
1

Моя модель Projelement имеет следующие функции обратного вызова:где вызывается после_обмена дважды?

after_create { |p| p.log_activity "created" } 
after_update { |p| p.log_activity "updated" } 

И Projelement.log_activity выглядит следующим образом:

# create new Activity object 
# point it to the project & projelement 
@a = Activity.new 
@a.projelement = self 
@a.project = self.project 

# record the type of activity 
case op_type 
when "created" 
    @a.operation = "created" 
when "deleted" 
    @a.operation = "deleted" 
when "updated" 
    @a.operation = "updated" 
end 

@a.save 

Так что, когда Projelement создается, все хорошо:

  • Один Activity запись created типа

Но когда Projelement обновляется, то я получаю:

  • Две дублирующие Activity записи updated типа
  • те же временные метки

Может after_update обратного вызова можно назвать дважды где-нибудь?

p.s. когда Projelement сохраняется, это выглядит примерно так (а Milestone является Projelement):

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 
+0

Тупой вопрос: вы спасая Projelement дважды? как выглядит код обновления? –

+0

Dumb initial post: извините, я забыл опубликовать код обновления. Хм, я думал, что не спасал дважды (смотрю на это в течение длительного времени). Но вставка кода ... Кажется, я называю 'update_attributes'', а затем' 'save''? –

+0

Публиковать это в качестве комментария, потому что вы действительно ответили на свой вопрос. Да, это потому, что вы вызываете ['update_attributes'] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L192) (который внутренне вызывает' save') и затем вы снова вызываете 'save'. – pjumble

ответ

2

Благодаря @ Frederick-Чунг и @pjumble:

В методе update, где Projelement экземпляр в настоящее время обновлено:

  • update_attributes вызывается
  • Тогда save называется

так after_update обратного вызова инициируется дважды в Projelement

Смежные вопросы