где after_update вызывается дважды? - PullRequest
1 голос
/ 01 апреля 2012

Моя модель 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 обратный вызов вызываться где-то дважды?

пс, когда 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

1 Ответ

2 голосов
/ 01 апреля 2012

Благодаря @ frederick-cheung и @pjumble:

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

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

, поэтому обратный вызов after_update инициируется дважды за Projelement

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...