Моя модель 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
Тупой вопрос: вы спасая Projelement дважды? как выглядит код обновления? –
Dumb initial post: извините, я забыл опубликовать код обновления. Хм, я думал, что не спасал дважды (смотрю на это в течение длительного времени). Но вставка кода ... Кажется, я называю 'update_attributes'', а затем' 'save''? –
Публиковать это в качестве комментария, потому что вы действительно ответили на свой вопрос. Да, это потому, что вы вызываете ['update_attributes'] (https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb#L192) (который внутренне вызывает' save') и затем вы снова вызываете 'save'. – pjumble