返回“ each.do”数组中的每个对象

时间:2019-04-29 12:10:54

标签: ruby-on-rails arrays ruby

标题可能无法正确描述我的问题,我不确定如何在没有视觉效果的情况下解释自己的工作。

我有一组障碍,每个障碍都连接到一个图(一个图有很多障碍)。每个图都与开发(一个开发有很多图)相关联。每个开发都链接到用户(一个用户有很多开发)

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

我当前在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,但是当然,它只返回最后的障碍/一组障碍,而不是所有障碍。

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

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

我不知道我在做什么错。

更新

今天再次用新的眼光看了我-我不知道为什么我的联接表没有填充,我今天将再次研究它以使事情“正常”工作-原来是错误我得到的原因是我试图在视图中实现的Sortable接口。删除Sortable之后,我便可以填充我的障碍数组,并得到了希望得到的输出。

2 个答案:

答案 0 :(得分:0)

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

有很多方法可以解决此问题,例如使用联接: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 %>

答案 1 :(得分:0)

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

private

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