2012-04-09 5 views
4

데이터베이스의 제목 목록을 사전 순으로 정렬하거나 블록으로 표시하려고합니다.알파벳순으로 정렬하고 그룹별로 표시

편지를 출력하고 그 편지로 시작하는 모든 제목을 포함하고 싶습니다. 예를 들어 :

    • 애플
  • B
을 anotherthing 나는 내가 할 수있는 것을 알고있다 .order ('title')를 사용하여 결과를 주문해야하지만 디스플레이 코드를 작성하는 가장 좋은 방법은 무엇인지 모르겠습니다.

답변

7
titles.group_by {|word| word[0].upcase } 

그래서, 다음의 경우 : 다음

titles = ['Apple', 'anothersomething', 'Bob'] 

:

grouped_titles = titles.group_by {|word| word[0].upcase } 
=> {"A"=>["Apple", "anothersomething"], "B"=>["Bob"]} 

, 당신은 배열로 변환하는 결과 해시를 정렬 할 수 있습니다 주문에 대한 확신하기 위해서 :

grouped_titles = grouped_titles.sort_by{|k, v| k} 
=> [["A", ["Apple", "anothersomething"]], ["B", ["Bob"]]] 

결과 배열을 반복한다. 이 방법을이 오히려 (관계에 .group 방법을 사용하여 수행 할 것이다) 데이터베이스에 비해, 루비에 그룹화되어 있지만 이미 페이지에있는 모든 데이터를 표시된다면 것을

<% grouped_titles.each do |initial_letter, titles| %> 
-display stuff here- 
<% end %> 

주 괜찮을거야.

+0

감사합니다. 나는 또한 숫자를 가지고 있으므로 group_by {| word | word.name [0] .capitalize.match (/ [A-Z] /)? word.name [0] .capitalize : "#"} – spyderman4g63

+0

해시이기 때문에 주문을 잃을 수 있습니다. 반복 부분에'("A".. "Z")'와'(0..9)'와 같은 범위를 사용할 것입니다. – tsherif

+0

사실 1.9부터는 루비 해시가 주문되어 있으므로 (http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash/) 항목이 알파벳 순서로 삽입되면, 당신이 반복 할 때 그들은 그 길을 유지할 것입니다. 또한 해시를 정렬 할 수 있다는 것을 의미합니다. – MrTheWalrus

0

@MrTheWalrus가 제안한 해결책은 순서를 유지하기 위해 목록을 제대로 반복하는 한 효과가 있다고 생각하지만 목록이 길면 조금 더 빨라질 대안을 제안 할 것입니다.

<% cur_letter = nil %> 
<% @titles.each do |t| %> 
    <% title_letter = t.name[0].capitalize.match(/[A-Z]/) ? t.name[0].capitalize : "#" %> 
    <% if title_letter != cur_letter %> 
    <% cur_letter = title_letter %> 
    <%= cur_letter %> 
    <% end %> 
    <%= t.name %> 
<% end %> 

나는 그것이 같은 조금 추한 인정한다 :

@titles = Title.order(:title) 

그런 다음 뷰의 반복이 같이 표시됩니다 : 당신이 할 것 같다 첫째 목록 순서에 있는지 확인 보기 코드를 사용하지만 목록을 한 번 반복하고 순서를 유지하며 간단한 조작이 아닌 group_by을 피할 수 있습니다.

관련 문제