데이터베이스의 제목 목록을 사전 순으로 정렬하거나 블록으로 표시하려고합니다.알파벳순으로 정렬하고 그룹별로 표시
편지를 출력하고 그 편지로 시작하는 모든 제목을 포함하고 싶습니다. 예를 들어 :
-
- 애플
- B
- 밥
데이터베이스의 제목 목록을 사전 순으로 정렬하거나 블록으로 표시하려고합니다.알파벳순으로 정렬하고 그룹별로 표시
편지를 출력하고 그 편지로 시작하는 모든 제목을 포함하고 싶습니다. 예를 들어 :
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 %>
주 괜찮을거야.
@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
을 피할 수 있습니다.
감사합니다. 나는 또한 숫자를 가지고 있으므로 group_by {| word | word.name [0] .capitalize.match (/ [A-Z] /)? word.name [0] .capitalize : "#"} – spyderman4g63
해시이기 때문에 주문을 잃을 수 있습니다. 반복 부분에'("A".. "Z")'와'(0..9)'와 같은 범위를 사용할 것입니다. – tsherif
사실 1.9부터는 루비 해시가 주문되어 있으므로 (http://www.igvita.com/2009/02/04/ruby-19-internals-ordered-hash/) 항목이 알파벳 순서로 삽입되면, 당신이 반복 할 때 그들은 그 길을 유지할 것입니다. 또한 해시를 정렬 할 수 있다는 것을 의미합니다. – MrTheWalrus