Я предполагаю, что у вас есть has_many :through
связь между User
и Item
до UserItem
, и вам нужно показать список в виде всех пользователей с соответствующим количеством элементов.
Это один из вариантов.
В контроллере (по количеству):
@users = User.joins(:user_items).group('user_items.user_id').select('users.*, COUNT(*) as item_count').order('count DESC')
Вид (очень простой):
<% @users.each do |user| %>
<p><%= user.name %> | <%= user.item_count %></p>
<% end %>
В моем комментарии есть синтаксическая ошибка для подсчета элементов @user
, если id = @user.id
:
UserItem.where(user_id: id).count
Edit1: Показать также пользователей без элементов.
Вариант 1, добавить к приведенному выше коду следующий код, чтобы выбрать пользователей без элементов:
@users_without_items = User.includes(:items).where(items: {id: nil})
<% @users_without_items.each do |user| %>
<p><%= user.name %> | 0</p>
<% end %>
Или получить все сразу (не упорядочено, запускает много запросов):
@user = User.all
<% @user.each do |user| %>
<p><%= user %> | <%= user.categories.count %></p>
<% end %>
Edit2: Извлечение хеша
{user_id => # of items per user}
Одной из опций может быть список всех пользователей и получение счетчика из хеша по его ключам:
@user_items_count = UserItem.group(:user_id).count
@users = User.all
<% @users.each do |user| %>
<p><%= user.name %> | <%= @user_items_count[user.id] || 0 %></p>
<% end %>
Протестировано в Rails
, в котором используются ActiveRecord
и erb
.