2013-05-31 4 views
0

Я попробовал один и тот же сценарий в rails consoleнеопределенный метод `каждый» в Rails 3.2

Но почему я получаю ...

не определен метод each для #<ProjectProcurementManagementPlan:0x007ff9ecda2148>

В моей модели я есть обратный вызов, который будет обновлять форму сразу

after_update :check_app_on_update? 

def check_app_on_update? 

     self.each do |ppmp| 
     ppmp_year = ppmp.year 
     get_app = AnnualProcurementPlan.where(year: ppmp_year) 
     get_id = get_app.map{|a| a.id } 
     get_id.each do |app_id| 
      update_attribute(:annual_procurement_plan_id, app_id) 
     end 
     end 
    end 

Но продолжает получать undefined method 'each'

Но всякий раз, когда я удалить петлю self.each ...

Я получаю 'stack level too deep' тип ошибки.

Будут оценены любые обходные пути.

EDIT

Хорошо, теперь я понимаю, что я должен придерживаться моего старого подхода. И это без each

def check_app_on_update? 
     ppmp_year = self.year 
     get_app = AnnualProcurementPlan.where(year: ppmp_year) 
     get_id = get_app.map{|a| a.id } 

     get_id.each do |app_id| 
     # ppmp = ProjectProcurementManagementPlan.last  
     #   ppmp.update_attribute(:annual_procurement_plan_id, app_id) 
     @idd = app_id 
     end 
     update_attribute(:annual_procurement_plan_id, @idd) 
    end 

Но я получаю сообщение об ошибке stack level too deep

Я видел из бревен, что есть бесконечный цикл.

(0.5ms) UPDATE "project_procurement_management_plans" SET "status" = 'Approved', "updated_at" = '2013-05-31 09:55:00.000000', "annual_procurement_plan_id" = 1 WHERE "project_procurement_management_plans"."id" = 19 
    AnnualProcurementPlan Load (0.5ms) SELECT "annual_procurement_plans".* FROM "annual_procurement_plans" WHERE "annual_procurement_plans"."year" = 2012 
    (0.2ms) ROLLBACK 
Completed 500 Internal Server Error in 16737ms 

SystemStackError - stack level too deep: 
    (gem) actionpack-3.2.11/lib/action_dispatch/middleware/reloader.rb:70:in `' 
+0

Что вы хотите точно проверить? Объект, который был только что обновлен? Или другие записи? – MrYoshiji

+0

Объект, который обновляется – xirukitepe

+0

Итак, вы хотите перебрать его атрибуты? Или просто конкретный? – MrYoshiji

ответ

0

self потому, что означает, 1 объект и нет .each метода 1 объекта, .each для коллекций.

+0

Спасибо, но как насчет «слишком глубокого уровня стека» – xirukitepe

+0

Пожалуйста, напишите, что в качестве отдельного вопроса вопросы, которые имеют несколько подзапросов, не подходят хорошо, обычно заголовок не работает или " оба "и т. д. –

3

Моя догадка:

stack level too deep происходит потому, что update_attribute()check_app_on_update? вызовы снова, что звонки update_attribute(), что вызывает check_app_on_update? снова ...

Вам нужно больше информации, чтобы быть более уверенным ...

+0

Я отредактировал мое сообщение. Благодарю. – xirukitepe

+0

@xirukitepe Попробуйте добавить отладочные отпечатки: один в начале метода и один перед вызовом 'update_attribute'. Если вы увидите последовательность отпечатков, то моя догадка верна. В этом случае вы не должны вызывать 'update_attribute' из' check_app_on_update? ', Потому что это вводит бесконечную рекурсию. –

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