2011-01-07 5 views
0

Ich versuche, die Ausgabe dieser Fund anzuzeigen -Schienen - Anzeigen von verschachtelten find hash

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

Hier ist meine Ausgangsschleife

<% @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 %> 

Die Schleife arbeitet, bis es zu projizieren bekommt, wenn er wirft dieser Fehler

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

Wenn ich es Projekte in der Schleife zu ändern gibt es diesen Fehler

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

Die Debug in Kategorien Ebene zeigt diese

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

Meine Beziehungen aussehen wie dieses

Benutzer has_many: user_plans -Plan has_many: user_plans has_and_belongs_to_many: Kategorien Kategorie has_one: Projekt has_and_belongs_to_many: Pläne Projekt has_many: Präsentationen,: abhängig =>: DELETE_ALL Präsentation belongs_to: Projekt

Muß ich meinen Fund geändert?

Danke, Alex

Antwort

1

Kategorie has_one: Projekt

so ist es einzelnes Objekt nicht Sammlung also keine each Methode.

+0

Danke, das hätte has_many sein sollen – Alex

1

Entsprechend Ihrer Beziehungsdefinitionen, Kategorie hat nur ein Projekt, also warum wollen Sie über e.project iterieren? Wenn Sie nur Debugging-Ausgabe angezeigt werden soll, ersetzen

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

mit

<%= debug(e.project) %> 

Aber wenn man tiefer gehen wollen, in Präsentationen, tun:

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

Ihr Problem, dass Sie ist rufen die Array-Methode .each für ein einzelnes Objekt auf.

category.project gibt Ihnen ein einzelnes Projektobjekt richtig? Das ist kein Array, Sie können also nicht jeden anrufen.

diese ersetzen:

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

mit

debug(e.project) 

Während Sie gerade dabei sind, ist hier ein anderer Rat: Verwenden Sie beschreibende Variablennamen. Warum stellt "p" einen Test dar, "d" einen Plan, "e" eine Kategorie usw.?Variablennamen sollten Ihnen sagen, was das Objekt ist. Ähnlich würde ich erwarten, dass die Variable @test ein Test-Objekt enthält. In Ihrem Code scheint es ein Array zu sein. Verwenden Sie mehrere Variablennamen für eine Variable, die eine Sammlung dieses Objekttyps enthält - z. B. @plans wäre ein Array von Plan-Objekten.

zB

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

Ist das nicht mehr lesbar?

+0

Das war ich hacken und ein bisschen faul sein die Endversion sieht aus wie deine :) – Alex

Verwandte Themen