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

问题描述 投票:0回答:3

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

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

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

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

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>

我无法弄清楚我在这里做错了什么。

UPDATE

今天再次用新鲜的眼睛看着它 - 我无法弄清楚为什么我的连接表没有填充,今天我将再次查看它以使事情“正常” - 它发现了我得到的错误是由于我试图在视图中实现的Sortable接口。一旦我删除了Sortable,我就可以填充我的障碍数组,并获得我希望的输出。

ruby-on-rails arrays ruby
3个回答
0
投票

你可以写作,

def get_snags(plots)
  plots.map { |plot| Snag.where(plot_id: plot.id) }
end

由于Map and Each方法之间存在很大差异。

并调用get_snags(@plots)将为您提供阵列,如,

[[与plot_id的障碍是23],[与plot_id的障碍是23],.. [与plot_id的障碍是xx]]

因此,要获得单个数组,您可以将其更新为,

def get_snags(plots)
  plots.map { |plot| Snag.where(plot_id: plot.id) }.flatten
end

但建议使用rails方式通过has_many-throughDevelopmentPlot定义Snag关联,

所以你可以打电话给development.snags


0
投票

当您在控制器内执行每个循环时,最终会得到变量qazxsw poi所假设的最后一个值。这个值就是你在视图中得到的。

有很多方法可以解决这个问题,例如使用连接:@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

0
投票

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

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

推荐问答