Как извлечь сгруппированные результаты из одной модели / таблицы и предоставить их представлению - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть модель с именем Language, в которой всего два столбца: язык и ссылка, и я хотел бы иметь возможность циклически проходить по каждой ссылке для каждого языка и отображаться в представлении.т.е. (очевидно, что это не код, это просто иллюстрация желаемого шаблона)

Language 1
   Link 1
   Link 2
   Link 3
Language 2
   Link 1
Language 3
   Link 1
   Link 2
Language 4
etc

Каков "рельсовый способ" извлечения этих данных, а затем представления их в представлении?(примечание: я бы знал, как это легко сделать, если бы данные были в двух разных моделях, но это не так)

1 Ответ

0 голосов
/ 21 февраля 2019

Итак, Railsy мог бы использовать следующее в вашем контроллере:

@languages = Language.all.group_by(&:language)

Это даст вам хэш языков, сгруппированных по языку (erm ...) языка (<- возможно,переименуйте столбец в <code>name, чтобы избежать этой неоднозначности?):

# { 'English' => [language_1, language_2, etc...],
#   'French' => [language_3, language_4],
#    etc... }

И тогда, на ваш взгляд,

<% @languages.each do |language_name, languages| %>
  <h1>
    <%= language_name %>
  </h1>
  <% languages.each do |language| %>
    <p>
      <%= language.link %>
    </p>
  <% end %>
<% end %>

Очевидно, что теги HTML могут быть любымиХотя я надеюсь, что это даст полезный пример.

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

Например:

# langage.rb
has_many :links

# link.rb
belongs_to :language

# your controller
@languages = Language.includes(:links)

А потом что-то вродеследующее в представлении:

<% @languages.each do |language| %>
  <h1>
    <%= language.language %>
  </h1>
  <% language.links.each do |link| %>
    <p>
      <%= link.url %>
    </p>
  <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...