2013-03-05 45 views
0

当我注释掉我的after_save回调时,我的ActiveRecord关联工作得很好。在Rails控制台,你会看到:为什么我的after_save回调会阻止我的ActiveRecord关联正确保存?

> @report = Report.create :name => "foo" 
=> #<Report id: 9, name: "foo", created_at: "2013-03-05 09:51:55", updated_at: "2013-03-05 09:51:55"> 
> @question = @report.questions.create :description => "bar" 
=> #<Question id: 18, standard_id: nil, description: "bar", element_id: nil, condition_id: nil, blueprint_name: nil, blueprint_url: nil, created_at: "2013-03-05 09:52:32", updated_at: "2013-03-05 09:52:32", additive: false, instructions: nil> 
> @report.questions 
=> [#<Question id: 18, standard_id: nil, description: "bar", element_id: nil, condition_id: nil, blueprint_name: nil, blueprint_url: nil, created_at: "2013-03-05 09:52:32", updated_at: "2013-03-05 09:52:32", additive: false, instructions: nil>] 
> @question.reports 
=> [#<Report id: 9, name: "foo", created_at: "2013-03-05 09:51:55", updated_at: "2013-03-05 09:51:55">] 

然而,协会停止工作,当我添加after_save回调question.rb如下:

def create_matching_surveys 
    self.reports.each do |report| 
     report.reviews.each do |review| 
     review.competitors.each do |competitor| 
      competitor.surveys.find_or_create_by_question_id(self.id) 
     end 
     end 
    end 
    end 

然后,在Rails的控制台,您可以:

> @report = Report.create :name => "foo" 
=> #<Report id: 13, name: "foo", created_at: "2013-03-05 10:20:51", updated_at: "2013-03-05 10:20:51"> 
> @question = @report.questions.create :description => "bar" 
=> #<Question id: 24, standard_id: nil, description: "bar", element_id: nil, condition_id: nil, blueprint_name: nil, blueprint_url: nil, created_at: "2013-03-05 10:21:02", updated_at: "2013-03-05 10:21:02", additive: false, instructions: nil> 
> @report.questions 
=> [#<Question id: 24, standard_id: nil, description: "bar", element_id: nil, condition_id: nil, blueprint_name: nil, blueprint_url: nil, created_at: "2013-03-05 10:21:02", updated_at: "2013-03-05 10:21:02", additive: false, instructions: nil>] 
> @question.reports 
=> [] 

无论报告是否包含具有竞争对手的评论,都会发生这种情况。

奇怪的是我认为回调是在问题被保存后发生的?因此,在这种情况发生之前,协会应该保存这些权利,对吗?

我该如何解决?

UPDATE

我想我有打电话给在对象的生命周期中的正确位置的回调,但我不能找到那个地方。这就是为什么我认为这一点:

> @report = Report.create :name => "foo" 
=> #<Report id: 20, name: "foo", created_at: "2013-03-05 12:29:35", updated_at: "2013-03-05 12:29:35"> 
> @question = @report.questions.create :description => "bar" 
=> #<Question id: 31, standard_id: nil, description: "bar", element_id: nil, condition_id: nil, blueprint_name: nil, blueprint_url: nil, created_at: "2013-03-05 12:30:14", updated_at: "2013-03-05 12:30:14", additive: false, instructions: nil> 
> @question.reports 
=> [] 
> @question.update_attributes :description => "foo" 
=> true 
> @question.reports 
=> [#<Report id: 20, name: "foo", created_at: "2013-03-05 12:29:35", updated_at: "2013-03-05 12:29:35">] 

顺便说一句,现在的这个方法是在question_observer.rb:

class QuestionObserver < ActiveRecord::Observer 

    def after_save(model) 
    model.reload 
    model.reports.reload 
    model.reports.each do |report| 
     report.reviews.each do |review| 
     review.competitors.each do |competitor| 
      competitor.surveys.find_or_create_by_question_id(model.id) 
     end 
     end 
    end 
    return true 
    end 

end 
+0

尝试返回'真的' – apneadiving 2013-03-05 10:34:55

+0

我很抱歉apneadiving,但我不明白。我在哪里/如何/为什么会尝试返回true? – 2013-03-05 10:37:29

+0

在回调结束时返回true – apneadiving 2013-03-05 10:42:51

回答

相关问题