0

私はしばらくの間、目的の結果をクエリするための最良の方法を見つけようとしてきましたが、クエリのいくつかのpoingで常に失敗することになります。

簡略化されたデータベース構造:

ユーザー:

id (integer)  
first_name (string)  
last_name (string)

コースタイプ:

title (string)
slug (string)

コース:

belongs_to :user  
belongs_to :course_type  
week (integer)  
sold (float)

私のコントローラーはスコープを呼び出しています:

@users = User.sales_results(week)

そして、これが私のモデルのスコープです:

scope :sales_results, lambda { |week|
  joins(:courses => [:course_type])
  .select("
    users.id, users.first_name, users.last_name,
    SUM(courses.sold) as total_sold,
    COUNT(courses) as num_classes
  ")
  .where("courses.week = ?", week)
  .group('users.id')
}

これは問題なく機能し、テンプレートで使用して合計販売額を表示できます。また、特定の種類のコースの販売額を合計した2番目の列も表示したいと思います。次のようになります。

<% @users.each do |user| %>
  <%= user.total_sold %>
  <%= user.total_sold.where("course_types.slug IN ('H', 'S')") # not possible, but similar to what I desire %>
<% end %>

アップデート

別のスコープを追加することになりました

  scope :sales_results_for_types, lambda { |week, types|
     sales_results(week).except(:group).where("course_types.slug IN (?)", types)
    .group('users.id')
  }

次に、コントローラーで両方のスコープを呼び出します

@users = User.sales_results(...)
@users_filtered = User.sales_results_for_types(...)

最後に、両方の結果を同時に繰り返します

<% @users.zip(@users_filtered).each do |user, filtered| %>
<%= filtered.total_sold %>
<%= user.total_sold %>

私が何かより良いものを理解するまで。私を正しい方向に導いてくれてありがとう。

4

1 に答える 1

0

別のクエリを使用しても問題ない場合は、これを使用できます

user.joins(courses: :course_type).sum(:sold, group: 'course_types.slug')

キーがスラッグで、値が合計であるハッシュが得られます。

于 2013-02-01T15:03:23.280 に答える