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 %>
모두에서 결과를 반복
마지막으로. 올바른 길로 인도 해 주신데 감사드립니다. 다른 쿼리를 필요로 확인하는 경우
[ 'H', 'S']에 범위를 정의하고 데이터베이스에 다른 쿼리를 작성해야 할 수도 있습니다. 하나의 복잡한 SQL에서 데이터를 가져올 수는 있지만 테이블을 두 번째로 조인하는 작업이 포함될 수 있으며 이는 훨씬 정교한 조인 조건입니다. –