2

这里有 3 个模型:

  • 项目
  • 线程(project_id)
  • thread_participations(thread_id,读取布尔值)

现在我有一个用户项目的列表,该列表显示每个项目有多少线程未读。这里最大的问题是,如果用户有多个项目(所有用户都这样做),它会导致数据库受到多个查询的影响,每个项目一个。

我想使用 Rails 构建一个查询,通过一个 DB 命中,返回每个用户项目的未读计数。

这是我今天在视图中使用的内容:

<% @projects.each_with_index do |project, i| %>
<%=project %>: <%= Thread.unread(current_user,project).count %>
<% end %>

在线程模型中:

  scope :unread, lambda { |user,project| 
      includes(:project,:thread_participations).where(:project_id => project.id, :thread_participations => {:read => false, :user_id => user.id})
  }

关于如何做到这一点的任何建议?这应该住在哪个模型中?也许是用户的模型,因为它不是项目或线程特定的?

谢谢

4

1 回答 1

1

有几种方法可以构建此查询,但这里有一种。

您可以在单个查询中执行此操作,然后循环遍历结果。我将首先为某个用户的未读线程创建一个范围。然后使用范围并包括所有线程和项目,按项目 id 分组(以便您获得该项目的未读线程),然后通过计算 threads.id 来计算未读线程的数量:

线程参与类
  范围:未读,lambda{ |用户| 其中(user_id:user.id,读取:false)}
结尾

主题参与
  .未读(当前用户)
  .includes(:thread => :project)
  .group('projects.id')
  .count('threads.id')

=> { 10 => 15, 11 => 10 }
# project(10) 有 15 个未读线程,project(11) 有 10 个未读线程
于 2011-02-05T19:23:40.387 回答