2013-02-01 2 views
0

나는 원하는 결과를 쿼리하는 가장 좋은 방법을 찾으려고 잠시 노력했지만 항상 쿼리의 일부 poing에 실패 결국.범위를 사용하여 고급 레일 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 %> 

모두에서 결과를 반복

마지막으로. 올바른 길로 인도 해 주신데 감사드립니다. 다른 쿼리를 필요로 확인하는 경우

+0

[ 'H', 'S']에 범위를 정의하고 데이터베이스에 다른 쿼리를 작성해야 할 수도 있습니다. 하나의 복잡한 SQL에서 데이터를 가져올 수는 있지만 테이블을 두 번째로 조인하는 작업이 포함될 수 있으며 이는 훨씬 정교한 조인 조건입니다. –

답변

0

, 당신은 사용할 수 있습니다 당신에게 키가 슬러그 있습니다 해시를주고, 값이 합계있는 것이

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

.