2011-02-05 106 views
2

在有3个车型在这里:在Rails中 - 如何让一个查询有多个查询?

  • 项目
  • 线程(PROJECT_ID)
  • thread_participations(thread_id单,阅读布尔)

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

我想使用Rails建立一个查询,在一个数据库命中的情况下,为每个用户的项目返回一个未读数。

这就是我今天使用的视图:

<% @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}) 
    } 

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

感谢

回答

1

有一对夫妇的方式来构建这个查询,但这里是一个。

您可以在单个查询中执行此操作,然后遍历结果。我首先会创建一个线程参与的范围,以便某个用户未读。然后使用范围,包括由项目ID的所有线程和项目组(让你得到读线程为该项目),然后通过计算threads.id计数未读的线程数:

 
class ThreadParticipations 
    scope :unread, lambda{ |user| where(user_id: user.id, read: false) } 
end 

ThreadParticipations 
    .unread(current_user) 
    .includes(:thread => :project) 
    .group('projects.id') 
    .count('threads.id') 

=> { 10 => 15, 11 => 10 } 
# project(10) has 15 unread threads and project(11) has 10 unread threads 
+0

谢谢,我不确定我是否遵循100%,所以让我问一下......为什么在ThreadParticipations中有未读范围,而不是像现在这样拥有Thread?只是好奇。此外,第二个块(ThreadParticipations .unread(current_user ...)在哪里,生活?控制器?thxs – AnApprentice 2011-02-05 22:31:55