2010-11-30 107 views
2

可以說我有content_categories的陣列(content_categories = user.content_categories)Ruby on Rails的:用陣列(鍵,數組值),以哈希

我現在要添加屬於某categorie每個元素與該類別作爲重點和內容項ID作爲一組

在PHP中像這樣的元素content_categories是可能的:

foreach ($content_categories as $key => $category) { 
    $contentsByCategoryIDArray = Category.getContents($category[id]) 
    $content_categories[$key][$contentsByCategoryIDArray] 
} 

是否有軌道一個簡單的方法來做到這一點?

映入眼簾,

尼科

+0

這將有助於如果你提供一些樣本值,你想處理數組後看到的。 – 2010-12-01 04:53:16

回答

4

你的問題並不是一個真正的Rails問題,這是一個普通的Ruby編程問題。

你的描述不是很清楚,但是從我所瞭解的情況來看,你希望使用哈希將常見類別的ID分組。這樣做有各種其他的方式,但是這是很容易理解::

ary = [ 
    'cat1', {:id => 1}, 
    'cat2', {:id => 2}, 
    'cat1', {:id => 3} 
] 

hsh = {} 
ary.each_slice(2) { |a| 
    key,category = a 
    hsh[key] ? hsh[key] << category[:id] : hsh[key] = [category[:id]] 
} 
hsh # => {"cat1"=>[1, 3], "cat2"=>[2]} 

我用一個簡單的數組與類別,其次是代表某些對象實例一個簡單的哈希值,因爲它可以很容易可視化。如果你有一個更復雜的對象,用這些對象替換散列條目,並調整你在三元組(?:)行的訪問方式。

使用Enumerable.inject():

hsh = ary.each_slice(2).inject({}) { |h,a| 
    key,category = a 
    h[key] ? h[key] << category[:id] : h[key] = [category[:id]] 
    h 
} 
hsh # => {"cat1"=>[1, 3], "cat2"=>[2]} 

Enumerable.group_by()大概可以收縮甚至更多,但我的大腦正在消失。

0
content_categories.each do |k,v| 
    content_categories[k] = Category.getContents(v) 
end 

我想這是工作

0

如果我理解正確,content_categories是類別的數組,這需要變成類的亂碼,他們的元素。

content_categories_array = content_categories 
content_categories_hash = {} 
content_categories_array.each do |category| 
    content_categories_hash[category] = Category.get_contents(category) 
end 
content_categories = content_categories_hash 

這是長的版本,你也可以這樣寫

content_categories = {}.tap do |hash| 
    content_categories.each { |category| hash[category] = Category.get_contents(category) } 
end 
3

我會使用Enumerable#inject

content_categories = content_categories_array.inject({}){ |memo, category| memo[category] = Category.get_contents(category); memo } 
2
Hash[content_categories.map{|cat| 
    [cat, Category.get_contents(cat)] 
}] 
1

沒有真正正確的答案,因爲你想ID在您的陣列中,但我張貼它,因爲它很好,很短,你可能會逃避它:

content_categories.group_by(&:category) 
0

對於此解決方案,content_categories必須是散列,而不是您描述的數組。否則,不知道你在哪裏得到鑰匙。

contents_by_categories = Hash[*content_categories.map{|k, v| [k, Category.getContents(v.id)]}] 
相關問題