2

ここに 3 つのモデルがあります。

  • プロジェクト
  • スレッド (project_id)
  • thread_participations (thread_id、ブール値を読み取る)

現在、ユーザーのプロジェクトのリストがあり、リストには、プロジェクトごとに未読のスレッドがいくつあるかが示されています。ここでの大きな問題は、ユーザーが複数のプロジェクトを持っている場合 (すべてのユーザーがそうです)、プロジェクトごとに 1 つずつ、複数のクエリで DB がヒットすることです。

Rails を使用して、1 つの 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

このクエリを構成するにはいくつかの方法がありますが、ここではその 1 つを示します。

これを 1 つのクエリで実行してから、結果をループできます。最初に、特定のユーザーの未読のスレッド参加に関するスコープを作成します。次に、スコープを使用してすべてのスレッドとプロジェクトを含め、プロジェクト ID でグループ化し (そのプロジェクトの未読スレッドを取得できるように)、threads.id をカウントして未読スレッドの数をカウントします。

クラス ThreadParticipations
  スコープ:未読、ラムダ{ |ユーザー| where(user_id: user.id, read: false) }
終わり

スレッド参加
  .unread(現在のユーザー)
  .includes(:スレッド => :プロジェクト)
  .group('projects.id')
  .count('threads.id')

=> { 10 => 15, 11 => 10 }
# project(10) には 15 個の未読スレッドがあり、project(11) には 10 個の未読スレッドがあります
于 2011-02-05T19:23:40.387 に答える