sql - 如何使用活动记录计算 has_many 关系?
问题描述
我有一个连接表,其中列出了一个user_id
和一个item_id
(多对多关系)。
我试图在 erb 页面上显示用户拥有多少项目。
我该怎么做呢?
我的联接表/模型 UserItem 现在有 11 条记录,所以很明显,如果我这样做UserItem.count
,它会给我 11 条记录。
但是我怎么能告诉它对于每个 user_id,计算那个特定用户有多少 item_id?然后显然我会对此进行迭代。
编辑:
好的,我发现这UserItem.group(:user_id).distinct.count
给了我 {user_id => # of items per user} 的返回哈希值。
我如何不仅迭代哈希,而且使它与每个当前 user_id 相关联?
<% @users.each do |user| %>
<li><%= user.username %>
has been to <%= UserItem.group(:user_id).distinct.count %>!</li>
<% end %>
到目前为止,这只是插入哈希,我如何对应每个 user_id 使其与显示的 user.username 对齐?
解决方案
我假设您has_many :through
之间存在关联,并且User
您需要在具有相关项目计数的所有用户的视图中显示列表。Item
UserItem
这是一种选择。
在控制器中(按 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
, if的项目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` 中测试。**
推荐阅读
- sql - Postgres-xl - InternalServerError:无法获取序列的当前值
- ios - 核心图像的色彩平衡
- java - ViewPager 轮播无法正确显示小图像
- python - 如何将 Python 3 设置为默认应用程序?
- python - 使用 Pandas 在选项卡中的单个 csv 表中添加多个 csv
- webpack - 延迟加载:使用 Webpack 的 Angular 1.6.x 版本
- wordpress - 将 Wordpress 电子商务网站与基于外部登录的 Vue 前端最佳实践相结合
- javascript - 谷歌图表折线图缩放不起作用
- python-3.x - 如何将一个测试用例的结果传递给 Robot Framework 中的另一个测试用例
- html - 如何创建一个方形 div,其宽度和高度完全等于响应式字符的高度?