2011-12-03 111 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