Как посчитать отношение has_many, используя активную запись? - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть таблица соединений, в которой перечислены user_id и item_id (отношение «многие ко многим»).

Я пытаюсь показать, сколько предметов пользователь владеет на странице erb.

Как мне это сделать?

Моя таблица соединений / модель UserItem в настоящий момент имеет одиннадцать записей, поэтому, если я сделаю UserItem.count, это даст мне 11.

Но как я могу сказать, что для каждого user_id посчитайте, сколько item_ids существует для ЭТОГО конкретного пользователя? И тогда, очевидно, я бы повторил это.

EDIT:

Хорошо, я обнаружил, что UserItem.group(:user_id).distinct.count возвращает мне хэш {user_id => # элементов на пользователя}.

Как мне не только перебрать хеш, но и сделать так, чтобы он связывал его с каждым текущим user_id?

<% @users.each do |user| %>
          <li><%= user.username %>
          has been to <%= UserItem.group(:user_id).distinct.count %>!</li>
        <% end %>

На данный момент, это просто вставляет хеш, как мне сопоставить каждый user_id, чтобы он совпадал с отображаемым именем user.user?

1 Ответ

0 голосов
/ 02 сентября 2018

Я предполагаю, что у вас есть 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...