Rails / Ruby命令/拆分它

时间:2011-12-03 20:20:25

标签: ruby-on-rails iteration

<% 
  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

也许在铁轨上有一些切割刀/不同的方式?

我不认为这是最好的代码...

谢谢!

2 个答案:

答案 0 :(得分: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中正确地完成工作。

答案 1 :(得分:1)

在控制台中尝试这样的事情:

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

这将返回一个散列,其中键将是各个城市,值将是相应事件对象的数组。然后,您可以轻松地遍历哈希的键,并在内部循环中迭代相应的事件对象。