【问题标题】:Returning each object in an 'each.do' array返回“each.do”数组中的每个对象
【发布时间】:2019-04-29 12:10:53
【问题描述】:

标题可能没有正确描述我的问题,我不知道如何在没有视觉效果的情况下解释我在做什么。

我有一组障碍,每个障碍都连接到一个情节(一个情节有很多障碍)。每个地块都链接到一个开发项目(一个开发项目有许多地块)。每个开发都链接到一个用户(一个用户有许多开发)

我想返回与每个开发人员相关的障碍列表。

我目前在我的 snags 控制器中有以下内容:

def index
  @developments = Development.accessible_by(current_ability)
                             .where(enable_snagging: true)
  @developments.each do |development|
    @plots = development.plots
    get_snags(@plots)
  end
end

private

def get_snags(plots)
  plots.each do |plot|
    @plot_snags = Snag.where(plot_id: plot.id)
  end
end

在我看来:

<table class="record-list snags">
  <thead>
    <tr>
      <th><%= sortable(@snags, :id) %></th>
    </tr>
  </thead>
  <tbody>
    <% @snags.each do |snag| %>
    <tr data-snag="<%= snag.id %>">
      <td><%= snag.id %></td>
    </tr>
    <% end %>
  </tbody>
</table>

我最初在控制器中用@snags 代替了@plot_snags,但当然只返回了最后一个snag / 一组snag,而不是全部。

如果我尝试创建并返回一个@snags 数组并将@plot_snags 中的每个对象添加到其中(或将@snags 声明为数组的任何其他变体),我会得到:

undefined method `human_attribute_name' for #<Array:0x007ff5334861d0>

我不知道我在这里做错了什么。

更新

今天再次以全新的眼光看待它 - 我无法弄清楚为什么我的连接表没有填充,我今天将再次查看它以让事情“正常”工作 - 结果是错误我得到的是由于我试图在视图中实现的 Sortable 接口。删除 Sortable 后,我就可以填充我的 snags 数组并获得我希望的输出。

【问题讨论】:

    标签: ruby-on-rails arrays ruby


    【解决方案1】:

    当您在控制器内执行每个循环时,您最终会得到变量 @some_variable_inside_the_loop 所假定的最后一个值。该值就是您在视图中获得的值。

    解决问题的方法有很多,比如使用join:https://guides.rubyonrails.org/v5.2/active_record_querying.html#joining-tables

    这是非常基本的选项,将视图中的循环移动为嵌套循环。

    模型:

    development has_many :plots
    plot has_many :snags
    

    控制器:

    def index
      @developments = Development.accessible_by(current_ability).where(enable_snagging: true)
    end
    

    查看(假设每个模型都有一个title 属性,但可以随心所欲):

    <% @developments.each do |development| %>
      <%= development.title %>
      <% development.plots.each do |plot| %>
        <%= plot.title %>
        <% plot.snags.each do |snag| %>
          <%= snag.title %>
        <% end %>
      <% end %>
    <% end %>
    

    【讨论】:

      【解决方案2】:

      您可以在单个查询中找到所有 plot_snag。并在视图中迭代@plot_snags 变量。

      private
      
      def get_snags(plots)
        plot_ids = plots.pluck(:id)   
        @plot_snags = Snag.where(plot_id: plot_ids)
      end
      

      【讨论】:

      • 这会执行两个查询,因为您使用的是不需要的 pluck。只需通过范围Snag.where(plot_id: plots)
      猜你喜欢
      • 2021-11-29
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 2020-07-06
      • 2020-03-10
      相关资源
      最近更新 更多