2011-12-03 4 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/Rubyの注文/分割

私は、これはそれのための最善のコードだとは思わない

...

ありがとう!

答えて

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の場合は、SQL/ActiveRecordの作業を適切に行うことができます。

+0

これは私の例ではうまくいきますが、ここにはもう少し複雑なものがあります。has_oneという関係を持つhas_many関係を持つActveRecordは、@ foo.barsを持っています。 include(:fuuu)は、2つのフィールドでグループ化していることをほとんど忘れていました:)そのようにする方法についてのヒント –

+0

それを稼働させるために管理してください!ありがとうDave !! –

+0

@BernardoMendes問題はありません:) ActiveRecordアプローチを試しましたか?この種の作業をDBレイヤーに移すことは、しばしばより高速になります。 –

1

は、コンソールでこのような何かを試してみてください:

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

このキーは、個々の都市や値は、対応するイベント・オブジェクトの配列になりますでしょうハッシュを返します。その後、簡単にハッシュのキーを繰り返し処理することができ、内側のループでは、対応するイベントオブジェクトを反復処理します。

+0

ちょっと@maprihoda、違いは何ですか:都市と&:都市、何が&rorでですか?ありがとうございます –

+0

@Bernardoあなたは 'city'で注文し、' object [:city] 'でグループ化しています。 'group_by(&:city)'は、より短い形式の 'group_by {| o | o [:city]} ' – maprihoda