做分组在红宝石
问题描述:
行,所以我有4个对象的像做分组在红宝石
=> [#<Graphic id: 3...">, #<Collection id: 1....">, #<Category id:...">, #<Volume id: 15...">]
matches.size
=> 4
与4个不同的对象(图形,收集,分类,体积)的阵列我现在需要这些分离成4的更简洁的方式基于对象的数组。所以我创造了这个方法,它的工作原理,但其所谓的hackish ....关于如何实现更简洁的方式同样的事情,任何想法...更多rubyesk
这里是我的方法
def self.get_results(matches)
graphics = [], collections = [], categories = [], sub_categories = []
matches.group_by(&:class).each do |key, group|
case group.first.class.to_s
when "Graphic"
graphics << group
when "Category"
categories << group
when "SubCategory"
sub_categories << group
when "Collection"
collections << group
end
end
[graphics.flatten, collections.flatten, categories.flatten, sub_categories.flatten]
end
答
matches_by = matches.group_by {|m| m.class.to_s }
%w{Graphic Category SubCategory Collection}.map do |class_name|
matches_by[class_name] || []
end
如果你不关心他们是在什么样的顺序,试试这个
matches.group_by {|m| m.class.to_s }.values
如果你只是想要一个哈希,类名(其中每个条目的值是对象的数组索引那种类型),它只是
matches.group_by {|m| m.class.to_s }
+0
我有种以为更多的“红宝石”的方式将不会有这些类硬编码,除非他真的需要他们的顺序。 – scragz 2011-01-23 06:29:37
答
ret = {}
matches.group_by(&:class).each do |klass, item|
ret[klass.to_s] = item
end
ret.values
+0
我觉得。每个...部分是不必要的 – Alexey 2011-01-22 19:08:11
注意,所谓“案件group.first”,然后选择“图形时,”应该是足够的,大小写没有更广泛的===,不是== – tokland 2011-01-22 20:13:29