2011-12-03 157 views
0
<% 
    old_city = "" 
    @objects.order("city").each do |obj| 
    if old_city != obj.city && old_city != "" 
     old_city = obj.city 
%> 
    --Different city-- 
<% 
    end 
%> 
    City: <%= obj.city %> 
<% 
end 
%> 

So that output expected is: 
Chicago 
Chicago 
--Different city-- 
New York 
New York 
New York 
--Different city-- 
Paris 
--Different city-- 
Rio de Janeiro 

也許有一些切肉刀/不同的方式來做到這一點在鐵軌?Rails /紅寶石訂購/拆分它

我不認爲這是最好的代碼...

謝謝!

回答

1

有幾個選項,但Enumerable offers a group_by method

group_by花費塊來定義分組。分組後,它是迭代結果圖的鍵的問題。

objs = [ 
    { :foo => 'baz', :wat => 'kthxbai' }, 
    { :foo => 'bar', :wat => 'narnar' }, 
    { :foo => 'plugh', :wat => 'xyzzy' }, 
    { :foo => 'bar', :wat => 'ohai' }, 
    { :foo => 'baz', :wat => 'fuuuu' }, 
    { :foo => 'plugh', :wat => 'jimmies' } 
] 

grouped = objs.group_by { |o| o[:foo] } 
grouped.each do |k, v| 
    puts "GROUP: #{k}" 
    v.each { |v| puts v } 
end 

如果要通過按鍵命令,你可以做到這一點通過排序鍵和檢索結果圖中的值,而迭代排序鍵。

如果他們是ActiveRecord s您可能想要在SQL/ActiveRecord正確的工作。

+0

好吧,這對我的示例工作......但我在這裏得到的是一個有點複雜......其有也使用了HAS_ONE關係的has_many關係的ActveRecord,我得到了@ foo.bars。包括:(:fuuu),差點忘了,我已經到組由2場:)如何做任何暗示 –

+0

設法得到它的工作!謝謝戴夫! –

+0

@BernardoMendes沒問題:)你嘗試使用ActiveRecord方法嗎?將這種工作轉移到數據庫層往往會更快。 –

1

嘗試這樣的事情在控制檯:

Event.order(:city).group_by(&:city) 

這將返回一個哈希值,其中鍵會出現個別城市和值將相應的事件對象的數組。然後,您可以輕鬆地遍歷散列的鍵,並在內部循環中迭代相應的事件對象。

+0

嗨@maprihoda,城市和&城市之間的區別是什麼?謝謝 –

+0

@Bernardo您正在'city'訂購,並且由'object [:city]'分組。 'group_by(&:city)'是'group_by {| o |的縮寫形式o [:city]}' – maprihoda