Условно для ruby, как отображать только один раз без повторения - PullRequest
0 голосов
/ 18 июня 2020

Итак, моя songs таблица выглядит так:

+----+---------------+
| id | artist        |
+----+---------------+
|  1 | One direction |
|  2 | One direction |
|  3 | The Beatles   |
|  4 | One direction |
|  5 | The Beatles   |
|  6 | Drake         |
|  7 | Drake         |
|  6 | One direction |
+----+---------------+

Если я выполню код, который я пытался выяснить, я думаю, он будет выглядеть так.

<% @songs.each do |song|  %> 
    <% if song.artist != "The one that appears on this list" %>
        <%= song.artist %>
    <% end %>
<% end %>

Я хочу, чтобы результат был таким же, как этот Без повторения, просто отображать только один раз каждый.

Вывод: Одно направление , The Beatle с, Дрейк

Ответы [ 4 ]

3 голосов
/ 18 июня 2020

Лучше всего сделать это с помощью ActiveRecord, чтобы фильтрация выполнялась в базе данных, а не в Ruby, поскольку базы данных более производительны:

Song.select(:artist).distinct

Вы также можете подумать о создании нового Artist и измените свою Song:

belongs_to :artist

Подробности см. В Руководстве по ассоциациям Active Record .

3 голосов
/ 18 июня 2020

Вы можете использовать pluck , чтобы получить имена всех исполнителей и добавить к ним uniq:

Song.pluck(:artist).uniq

Это даст вам уникальный список художников, которые у вас есть. Затем вы можете отобразить его, чтобы создать свой html выход.

Он также работает напрямую с @songs :)

1 голос
/ 18 июня 2020

Song.select (: artist) .uniq

или вы можете создать модель исполнителя и фильтровать в соответствии с ней .....

0 голосов
/ 18 июня 2020

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

<% @songs.group_by(&:artist).each do |(artist, songs)|  %> 
  <%= artist %>

  <% songs.each do |song| %>
    <%= song %>
  <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...