rails - 显示嵌套查找哈希

时间:2011-01-07 15:35:41

标签: ruby-on-rails activerecord

我正在尝试显示此查找的输出 -

@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:presentations,:dependent =&gt; :删除所有 介绍  belongs_to:project

我需要更改我的发现吗?

谢谢,Alex

3 个答案:

答案 0 :(得分:1)

  

类别has_one:项目

所以它是单个对象而不是集合,因此没有each方法。

答案 1 :(得分:1)

根据您的关系定义,Category only 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 %>

答案 2 :(得分:1)

你的问题是你在一个对象上调用数组方法.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 %>

这不是更具可读性吗?