2011-01-22 208 views
0

行,所以我有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 
+0

注意,所謂「案件group.first」,然後選擇「圖形時,」應該是足夠的,大小寫沒有更廣泛的===,不是== – tokland 2011-01-22 20:13:29

回答

6
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

2
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