【问题标题】:rails - displaying nested find hashrails - 显示嵌套的查找哈希
【发布时间】:2011-01-07 15:35:40
【问题描述】:

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

@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 :categories 类别 has_one : 项目 has_and_belongs_to_many:计划 项目 has_many :presentations, :dependent => :delete_all 介绍 属于_to:项目

我需要更改我的发现吗?

谢谢,亚历克斯

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    类别 has_one :project

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        这样不是更易读吗?

        【讨论】:

        • 那是我的黑客行为,有点懒惰,完成版看起来像你的 :)
        猜你喜欢
        • 1970-01-01
        • 2022-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多