rails - отображение вложенного хэша find - PullRequest
0 голосов
/ 07 января 2011

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

@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: планы Проект has_many: презентации,: зависимый =>: delete_all Презентация принадлежит_: проект

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

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

Ответы [ 3 ]

1 голос
/ 07 января 2011

Категория has_one: проект

, так что это отдельный объект, а не коллекция, поэтому нет метода each.

1 голос
/ 07 января 2011

Ваша проблема в том, что вы вызываете метод массива .each для одного объекта.

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

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

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

на

debug(e.project)

Пока вы там,Вот еще один совет: используйте описательные имена переменных.Почему «p» представляет тест, «d» представляет план, «e» представляет категорию и т. Д.?Имена переменных должны сообщать вам, что это за объект.Точно так же я ожидаю, что переменная @test будет содержать объект 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 %>

Разве это не более читабельно

1 голос
/ 07 января 2011

В соответствии с вашими определениями отношений, у категории только есть проект 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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...