2010-11-30 86 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)]}]