如何使用活动记录计算has_many关系?

时间:2018-09-02 16:45:11

标签: sql ruby activerecord sinatra-activerecord

我有一个联接表,其中列出了user_iditem_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对齐?

1 个答案:

答案 0 :(得分:3)

我假设您在has_many :throughUserItem之间具有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


编辑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中使用ActiveRecorderb进行了测试。