2012-11-20 78 views
2

每個聯繫人都有一個first_name和last_name。在我的聯繫人索引中,按ASC順序顯示由last_name組成的default_scoped列表。這工作正常,但我希望做得更好。按姓氏排列聯繫人以按字母順序排列的列表顯示

我想在索引中創建一個有組織的列表,以他們的姓氏的第一個字母對聯繫人進行分組,並且我有點困惑於如何完成此操作。其結果將是這樣的:

<div class="contacts" id="contact_list_a"> 
    <h2>A</h2> 
    <div class="contact">John Abercrombie</div> 
    <div class="contact">Julie Aloters</div> 
</div> 

<div class="contacts" id="contact_list_b"> 
    <h2>B</h2> 
    <div class="contact">Harry Bronson</div> 
    <div class="contact">Stevie Brussels</div> 
</div> 

...(continues) 

我只看到兩個選項,到目前爲止,因爲我的經驗不足:

1)我可以爲每個字母創建一個變量,並添加聯繫人酌情每。這會創建大量的數據庫調用(我假設),並且我的控制器中的大量變量看起來並不優雅。我可以將我的模型中的所有聯繫人拉入單個變量(我現在正在做的),然後在我的控制器中創建一個私有方法,它遍歷數組並相應地分配新變量。這仍然看起來效率低下,但是對我來說#1更好。

你能否提供一個更好的方法來實現這一目標?我使用Ruby 1.9.3和Rails 3.2.8。

回答

3

一旦你拉你的用戶進入,說users,你可以將它們與

# creates a hash mapping first letter of last name to array of corresponding users 
groups = users.group_by { |user| user.last_name[0].downcase } 

在你看來,你可以通過哈希迭代如下:

<% groups.each do |letter, contacts| %> 
    <div class="contacts" id="contact_list_<%= letter %>"> 
    <h2>letter.upcase</h2> 
    <% contacts.each do |contact| %> 
     <div class="contact"><%= contact.full_name %></div> 
    <% end %> 
    </div> 
<% end %> 
+0

完美!這正是我期望做的。感謝您的指導。 – Steve