我有一个联接表,其中列出了user_id
和item_id
(多对多关系)。
我试图显示用户在erb页面上拥有多少个项目。
我该怎么做?
我的联接表/模型UserItem现在有11条记录,因此很明显,如果我执行UserItem.count
,它将得到11。
但是我怎样才能告诉我,对于每个user_id,计算该特定用户有多少个item_id?然后显然我会对此进行迭代。
编辑:
好吧,我发现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.username对齐?
答案 0 :(得分:3)
我假设您在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
方法一,在上面的代码中添加以下内容,以获取没有项目的用户:
@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 %>
{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
进行了测试。