2011-06-21 5 views

答えて

15

あなたはこのような何かしなければならない:ビューで

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

は、ここでは、このエリアには本当に素晴らしいガイドです名前の最初の文字を保持する別の列(たとえばfirst_letter)を作成し、最初の文字が文字でない場合は「#」を作成します。 (私は一度に1つの文字を示していたときに、あなたが最初の文字で照会していない場合、これはおそらく過剰ですので、私は一般的に、これを行う。)

お使いのコントローラコードが@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} 
+0

"F"で始まるすべてのユーザーへのリンクを作成し、これを別のページに表示するにはどうすればよいですか? –

6

DBからのすべての連絡先を取得し、:

A - - > コンタクト

Bで始まる> コンタクトなど

最終的な外観は、Bで始まります配列のenum.group_byメソッドを使用してください:

時間@contactsで私はあなたが欲しいものを誤解しない限り、これは、家にあなたを得ると確信してい
+0

をクールな答えのおかげで、このアプローチは、実際に動作しますが、私の実装では、私は、ネストされたビューのループを必要とする「ことにより、 JQueryモバイルは最初の文字とオブジェクトの名前を異なるCSSクラスとして保持するため、「開始名」と「連絡先名」 – Harry

0

...この時点で

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

は、結果のリストではありませんが、SQLを実行しますイテレータですあなたが最初に結果を得るためにそれを使用しようとするとき(.each、.count、etc)。 、

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

SQLクエリに 'GROUP BY'節を張ります。これにより、同じ 'name'を持つレコードは、最初は無視されますが、これは目標ではありません。 – coreyward

+0

私はそれから誤解しました:P完全に。私は半分で物事をしない、と思います。振り返ってみると、Semyonの答えは行く道だと思います。 – jaydel

関連する問題