Как я могу объединить два массива в один по общему признаку?

Как я могу объединить два массива в один, например...

Day 1: Notes/form
Day 2: Notes/form
Day 3: Notes/form
Day 4: Notes/form
Day 5: Notes/form

Если пользователь создаст заметку в День 3, это будет выглядеть так...

Day 1: Notes/form
Day 2: Notes/form
Day 3: Notes/notes
Day 4: Notes/form
Day 5: Notes/form

Приведенный ниже код чудовищности пытался достичь вышеупомянутого, но итерация полностью отключена. Например, если заметка создается в день 1 и день 3, то результат будет выглядеть следующим образом...

Day 1: Notes/notes # Shows both Day 1 and Day 3 note. Only want to show Day 1 note
Day 1: Notes/form
Day 2: Notes/form
Day 2: Notes/form
Day 3: Notes/notes # Shows both Day 1 and Day 3 note. Only want to show Day 3 note
Day 3: Notes/form
Day 4: Notes/form
Day 4: Notes/form
Day 5: Notes/form
Day 5: Notes/form

проблемы / показать

<% @challenge.dates_challenged.first(@challenge.days_challenged).each_with_index do |date, i| %>
  <% @notes.each do |note| %>
    Day <%= i + 1 %>
    <% if note.notes_date.strftime("%m/%d/%y") == date.strftime("%m/%d/%y") %>
      <%= render 'notes/notes' %>
    <% else %>
      <%= render 'notes/form', :date => date %>
    <% end %>
  <% end %>
<% end %>

Напомним, что пользователь создает вызов. Задача имеет атрибут days_challenged, Пользователь выбирает, сколько дней будет оспорено, то есть 10, 15, 30 и т. Д. Для каждого из этих дней я хочу показать заметки / форму. Если пользователь затем вводит заметку в день, тогда заметку / форму следует заменить на странице показа этой заметкой (ни один день не должен иметь более одной заметки, связанной с ней).

1 ответ

Решение

Вы делаете слишком много внутри цикла, который вы используете, чтобы найти заметку дня. Это должно быть правильно:

<% @challenge.dates_challenged.first(@challenge.days_challenged).each_with_index do |date, i| %>
  Day <%= i + 1 %>
  <% if @notes.any? { |note| note.notes_date.strftime("%m/%d/%y") == date.strftime("%m/%d/%y") } %>
    <%= render 'notes/notes' %>
  <% else %>
    <%= render 'notes/form', :date => date %>
  <% end %>
<% end %>

Это все еще слишком много логики в представлении.

  1. Как прокомментировал фотоионизированный, было бы легче, если @notes были Hash чьи ключи были Dateи чьи значения были Notes, Затем вы можете заменить any? с поиском по хешу.
  2. Мне непонятно зачем нужно сравнивать strftime("%m/%d/%y"), Вы должны просто быть в состоянии сравнить Dates. (Если вы не можете сделать это, потому что они находятся в разных часовых поясах или что-то в этом роде, рассмотрите возможность исправить это - это вызовет путаницу во всем приложении.)
  3. Я бы извлек dates_challenged.first(@challenge.days_challenged) в метод на Challenge назвал что-то вроде current_dates_challenged и использовать это в представлении.
Другие вопросы по тегам