我正在尝试显示此查找的输出 -
@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
答案 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 %>
这不是更具可读性吗?