ruby - заказать коллекцию group_by desc? - PullRequest
0 голосов
/ 28 февраля 2019

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

Контроллер:

@line_items = Spree::LineItem.joins(:order).where(spree_orders: {state: "complete"})
@products = @line_items.group_by(&:name)

Просмотр:

<% @products.each do |name, line_items| %>
     <%= name %> - <%= line_items.count %><br>
<% end %>

Есть ли способ заказать цикл .each, чтобы он уменьшался на line_items.count?

Спасибо

1 Ответ

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

Будет лучше получать правильные данные напрямую из базы данных:

@products = @line_items.group(:name).order("count_all DESC").count

Это даст вам имена и количество напрямую, например,

# => { "line_1" => 3, "line_2" => 2, "line_3" => 8 }

Есть немного Railsмагия на работе: SQL, сгенерированный с использованием group, order и count, будет выглядеть так:

SELECT COUNT(*) AS count_all, name AS name FROM spree_line_items GROUP BY name ORDER BY count_all DESC

Вот где count_allпроисходит из: Rails автоматически присоединяет его к столбцу count.

Затем вы можете подключить это непосредственно к вашему представлению:

<% @products.each do |name, line_item_count| %>
  <%= name %> - <%= line_item_count %><br>
<% end %>

В качестве альтернативы, если вы используете переменную экземпляра в другом месте, вотпростое решение на Ruby:

@products = @line_items.group_by(&:name).sort_by { |_k, line_items| line_items.count }.reverse

Это просто использует sort_by, чтобы получить записи, упорядоченные по соответствующему количеству, и наоборот, чтобы получить порядок убывания.Есть хороший тест для этого здесь .

Надеюсь, что это поможет - дайте мне знать, как вы поживаете / если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...