Возврат каждого объекта в массиве each.do - PullRequest
1 голос
/ 29 апреля 2019

Заголовок, возможно, не описал мой вопрос должным образом, я не был уверен, как объяснить, что я делаю без визуальных эффектов.

У меня есть набор препятствий, каждый из которых связан с сюжетом (на графике много препятствий) . Каждый сюжет связан с разработкой (разработка имеет много участков) . Каждая разработка связана с пользователем (у пользователя много разработок) .

Я хочу вернуть список ошибок, которые имеют отношение к каждому разработчику.

В настоящее время в моем контроллере 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>

Первоначально у меня вместо контроллера @plot_snags в контроллере была @snags, но, конечно, она возвращала только последний набор ошибок, а не все.

Если я попытаюсь создать и вернуть массив @snags и добавить к нему каждый объект в @plot_snags (или любой другой вариант объявления @snags как массива), я получу:

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

Я не могу понять, что я делаю здесь неправильно.

UPDATE

Сегодня я снова посмотрел на нее свежим взглядом - я не мог понять, почему мой стол присоединения не заполнен, сегодня я еще раз посмотрю на него, чтобы все заработало «правильно» - оказывается, ошибка Я получал из-за интерфейса Sortable, который я пытался реализовать в представлении. После того, как я удалил Sortable, я смог заполнить массив snags и получить вывод, на который надеялся.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Вы можете найти все plot_snags в одном запросе.Итерируйте переменную @plot_snags в представлении.

private

def get_snags(plots)
  plot_ids = plots.pluck(:id)   
  @plot_snags = Snag.where(plot_id: plot_ids)
end
0 голосов
/ 29 апреля 2019

Когда вы выполняете каждый цикл внутри контроллера, вы получаете последнее значение, присвоенное переменной @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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...