2011-01-07 41 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:计划 项目 的has_many:演示:依赖=>:DELETE_ALL 介绍 belongs_to的:项目

我需要改变我的发现?

谢谢,亚历克斯

回答

1

类别HAS_ONE:项目

所以它是单一的对象不是集合因此没有each方法。

+0

谢谢,应该是has_many – Alex 2011-01-07 15:48:21

1

根据你的关系定义,Category只有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

你的问题是你在单个对象上调用数组方法。

category.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 %> 

是不是更具有可读性?

+0

这就是我的黑客和有点懒惰的完成版本看起来像你:) – Alex 2011-01-07 16:28:08