如何使用活动记录计算 has_many 关系?
How to count a has_many relationship using active record?
我有一个连接 table,其中列出了一个 user_id
和一个 item_id
(多对多关系)。
我正在尝试显示用户在 erb 页面上拥有多少项目。
我该怎么做?
我的加入 table/model UserItem 现在有 11 条记录,所以显然如果我这样做 UserItem.count
,它会给我 11。
但是我如何才能告诉它对于每个 user_id,计算该特定用户有多少 item_ids?然后显然我会对此进行迭代。
编辑:
好的,我发现 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 对齐?
我假设您在 User
和 Item
到 UserItem
之间有一个 has_many :through
关联,您需要在所有用户的视图中显示列表相关项目数。
这是一个选项。
在控制器中(按 item_count 排序):
@users = User.joins(:user_items).group('user_items.user_id').select('users.*, COUNT(*) as item_count').order('item_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:** 也显示没有物品的用户。
选项一,在上面的代码中添加以下内容,以获取没有项目的用户:
@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 %>
**在使用 ActiveRecord 和 erb 的 `Rails` 中测试。**
我有一个连接 table,其中列出了一个 user_id
和一个 item_id
(多对多关系)。
我正在尝试显示用户在 erb 页面上拥有多少项目。
我该怎么做?
我的加入 table/model UserItem 现在有 11 条记录,所以显然如果我这样做 UserItem.count
,它会给我 11。
但是我如何才能告诉它对于每个 user_id,计算该特定用户有多少 item_ids?然后显然我会对此进行迭代。
编辑:
好的,我发现 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 对齐?
我假设您在 User
和 Item
到 UserItem
之间有一个 has_many :through
关联,您需要在所有用户的视图中显示列表相关项目数。
这是一个选项。
在控制器中(按 item_count 排序):
@users = User.joins(:user_items).group('user_items.user_id').select('users.*, COUNT(*) as item_count').order('item_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:** 也显示没有物品的用户。
选项一,在上面的代码中添加以下内容,以获取没有项目的用户:
@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 %>
**在使用 ActiveRecord 和 erb 的 `Rails` 中测试。**