2011-06-21 65 views

回答

15

你必須做這樣的事情:

@users = User.all.group_by{|u| u.name[0]} 

在視圖:

<% @users.keys.sort.each do |starting_letter| %> 
    <%= starting_letter %> 
    <% @users[starting_letter].each do |user| %> 
    <%= user.name %> 
    <% end %> 
<% end %> 
+0

如何創建一個鏈接到所有以「F」開頭的用戶並將其顯示在單獨的頁面上? –

6

獲取從數據庫中的所有聯繫人和在陣列上使用enum.group_by方法:

@contacts = Contact.order(:name) 
@contacts.group_by{ |contact| contact.name[0] }.each do |contact| 
    # ... 
end 
+0

酷的回答感謝,這種方法確實有效,但在我執行我需要嵌套循環視圖「通過開始名稱「和」通過聯繫人名稱「,因爲jQuery mobile將第一個字母和對象名稱保存爲不同的css類 – Harry

0

我相信,這將帶你回家,除非我誤解你想要的...

@contacts.order(:name).group(:name) 

在這個時刻@contacts不是結果列表中,但將執行SQL迭代當你第一次嘗試使用它來獲得結果(.each,.count等)。

這裏對這一領域真正偉大指南:ActiveRecord querying

+0

This將在SQL查詢中粘貼一個「GROUP BY」子句。這將導致具有相同「名稱」的記錄除了第一個被忽略之外,這不是目標。 – coreyward

+0

我誤解了:P完全。我想,我不會做一半事情。我想回想起來,謝苗的答案是要走的路。 – jaydel

0

當我按字母順序排列的結果,我創建了一個單獨的列(例如first_letter)來保存名稱的第一個字母,或當第一個字符不是字母時,保留「#」。 (我一般做這個的時候我只顯示一次一個字母,所以如果你不按首字母查詢這可能是矯枉過正。)

控制器代碼看起來像@contacts = Contact.all.order('first_letter, name').group_by(&:first_letter)

簡單(HAML)視圖看起來是這樣的(我不是很快看到想要什麼樣的輸出的jQuery移動的):

- (['#'] + ('A'..'Z').to_a).each do |letter| 
    %h2 #{letter} 
    %ol 
    - if [email protected][letter].empty? 
     - @contacts[letter].each do |contact| 
     %li #{contact.name}