2014-07-23 2 views
0

레일 및 액티브 레코드 쿼리를 처음 사용합니다. 빈도별로 쿼리 결과를 정렬하고 싶습니다.활성 레코드의 빈도 순 주문

SQL 쿼리가 그것 수 :

SELECT author FROM books GROUP BY author ORDER BY COUNT(*) DESC LIMIT 10; 

(내가 here을 발견하고이 질문을 프레임에 매우 도움이되었다.)

지금은 알파벳순으로 그것을 할 것입니다 무엇을 :

<p>The authors are: <% @books.select(:author).distinct.order(:author).each do |book| %> 
    <br><%= book.author %> <%= @books.where(author: book.author).count %> 
<% end %></p> 

나를 얻을 수있는 사람 : 예 :

아시모프, 이삭이

딕, 필립 K. 8

Pynchon, 토마스 3

하지만 주파수에 의한 결과 (딕, Pynchon, 아시모프)을 주문하려면, 알파벳 순서가 아닙니다.

가능하면 출력물에 빈도를 알아내는 더 좋은 방법이 있지만 저자명과 책 수를 가능한 한 별도의 출력으로 남기고 싶습니다 (테이블로 전환 할 수 있기를 원합니다). @books.where(author: book.author).count 대신). 그러나 주요 쟁점은 초기 주문 권리를 얻는 것입니다.

도움을 주시면 대단히 감사하겠습니다.

답변

3

Book.group("author").order("count_author desc").count("author") 

그래서보기 아래의 샘플 쿼리 및 생성 된 SQL을 사용하여

<% @books.group("author").order("count_author desc").count("author").each do |author, count| %> 
    <br><%= author %> <%= count %> 
<% end %></p> 
+0

FYI : 쿼리가 컨트롤러에 있어야합니다. – Brandon

2

모양을 시도

Task.group(:project_id).limit(10).count(:id) 
SELECT COUNT(`tasks`.`id`) AS count_id, project_id AS project_id FROM `tasks` GROUP BY project_id LIMIT 10 
Output: {18=>1206, 22=>82, 23=>25, 25=>77, 29=>1, 35=>1, 42=>30, 44=>1, 45=>17, 53=>12} 

당신은 볼 수 컨벤션, 레일에 의해 카운트에 count_<column name>을 사용합니다. 해당 규칙에 따라 주문할 수 있습니다.

Task.group(:project_id).limit(10).order('count_id DESC').count(:id) 
SELECT COUNT(`tasks`.`id`) AS count_id, project_id AS project_id FROM `tasks` GROUP BY project_id ORDER BY count_id DESC LIMIT 10 
Output: {145=>1949, 105=>1535, 18=>1206, 141=>738, 23804=>667, 9892=>524, 196=>478, 26969=>338, 24119=>330, 28047=>300} 

당신이 달성하고자하는 일을 할 수있는 더 좋은 방법은 컨트롤러의 변수를 준비하고보기

# controller 
@counts = Book.group(:author).order('count_id DESC').count(:id) 

# view 
<% @counts.each do |author, count| %> 
    <%= author %> <%= count %> 
<% end %> 

@counts 위의 키가 저자이다 해시를 포함 그들에 액세스하는 것입니다, 그 값은 그 저자에 의한 책의 수입니다.

관련 문제