使用范围的高级Rails ActiveRecord查询

时间:2013-02-01 14:53:33

标签: sql ruby-on-rails join rails-activerecord

我已经尝试了一段时间来找到查询所需结果的最佳方法,但我总是在查询中失败了。

简化的数据库结构:

用户:

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

CourseType:

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')
}

这很好用,我可以在我的模板中使用它来显示已售出的总金额。虽然我还想展示第二栏,其中总结了某些特定类型课程的销售价值。这样的事情:

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

直到我找到更好的东西。谢谢你们带领我走上正轨。

1 个答案:

答案 0 :(得分:0)

如果您可以使用其他查询,则可以使用此

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

会给你一个散列,其中键是slugs,值是总和。