2011-01-07 1 views
0

Я пытаюсь отобразить вывод этой находки -рельсов - отображающие вложенный найти хэш

@test = User.joins(:plans => [:categories => [:project => :presentations]]).where(current_user.id) 

Вот мой выход контур

<% @test.each do |p| %> 
    <%= p.plans %> 
    <% p.plans.each do |d| %> 
    <%= debug(d) %> 
    <% d.categories.each do |e| %> 
     <% e.project.each do |r| %> 
     <%= debug(r) %> 
     <% end %> 
<% end %> 
    <% end %> 
<% end %> 

Цикла работает до тех пор, пока не получит проект, когда он бросает эта ошибка

undefined method `each' for "#<Project:0x000001033d91c8>":Project 

Если я изменю его проекты в цикле он дает эту ошибку

undefined method `projects' for #<Plan:0x000001033da320> 

отладки на категории уровне показывает это

--- !ruby/object:Category 
attributes: 
id: 2 
name: test 
short_name: tst 
created_at: 
updated_at: 
category_id: 2 
plan_id: 5 

Мои отношения похожи на эту

пользователя has_many: user_plans План HAS_MANY: user_plans has_and_belongs_to_many: Категории Категория has_one: проект has_and_belongs_to_many: plans Проект has_many: презентации,: зависимый =>: delete_all Презентация belongs_to: проект

мне нужно изменил мою находку ли?

Спасибо, Алекс

ответ

1

Категории has_one: Проект

поэтому один объект не коллекция, таким образом, не each метода.

+0

Спасибо, что должно было быть has_many – Alex

1

В соответствии с вашими определениями отношений в категории только проект has_one, так почему вы хотите перебирать e.project? Если вы просто хотите, чтобы показать отладочную заменить

<% e.project.each do |r| %> 
    <%= debug(r) %> 
<% end %> 

с

<%= debug(e.project) %> 

Но если вы хотите пойти глубже, в презентации, сделайте следующее:

<%= debug(e.project) %> 
<% e.project.presentations.each do |presentation| %> 
    <%= debug(presentation) %> 
<% end %> 
1

Ваша проблема в том, что вы вызывают метод array .each на одном объекте.

category.project предоставит вам один объект проекта прямо? Это не массив, поэтому вы не можете называть их.

Заменить это:

<% e.project.each do |r| %> 
<%= debug(r) %> 
<% end %> 

с

debug(e.project) 

Пока вы на него, вот некоторые другие советы: использовать описательные имена переменных. Почему «p» представляет тест, «d» представляет план, «e» обозначает категорию и т. Д.?Имена переменных должны сообщать вам, что это за объект. Точно так же я ожидал, что переменная @test проведет тестовый объект. В вашем коде это кажется массивом. Используйте множественные имена переменных для переменной, которая содержит коллекцию этого типа объекта - например, @plans будет массивом объектов Plan.

например

<% @tests.each do |test| %> 
    <% test.plans.each do |plan| %> 
    <%= debug(plan) %> 
    <% plan.categories.each do |category| %> 
    <%= debug(category.project) %> 
    <% end %> 
    <% end %> 
<% end %> 

Разве это не более читаемым?

+0

Это был я, взломавший и немного ленивый, финишная версия выглядит как ваша :) – Alex

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