Ruby on Rails:使用哈希的数组(键,值数组)

时间:2010-11-30 13:43:34

标签: ruby-on-rails ruby

假设我有一个content_categories数组(content_categories = user.content_categories)

我现在想要将属于某个类别的每个元素添加到content_categories,其中类别作为键,内容项ID作为集合的元素

在PHP中,这样的事情是可能的:

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

在rails中有一种简单的方法可以做到这一点吗?

迎接,

尼科

7 个答案:

答案 0 :(得分: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]}

我正在使用一个带有类别的简单数组,后跟一个表示某个对象实例的简单哈希,因为它可以很容易地进行可视化。如果您有一个更复杂的对象,请将哈希条目替换为这些对象,并调整您在三元组(?:)行中访问ID的方式。

使用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()可能会缩小它,但我的大脑正在消退。

答案 1 :(得分:3)

我会使用Enumerable#inject

content_categories = content_categories_array.inject({}){ |memo, category| memo[category] = Category.get_contents(category); memo }

答案 2 :(得分:2)

Hash[content_categories.map{|cat|
  [cat, Category.get_contents(cat)]
}]

答案 3 :(得分:1)

不是真正正确的答案,因为你需要数组中的ID,但我还是发布它,因为它很好而且很短,你可能真的可以使用它:

content_categories.group_by(&:category)

答案 4 :(得分:0)

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

我认为这是有效的

答案 5 :(得分: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 

答案 6 :(得分:0)

对于此解决方案,content_categories必须是哈希,而不是您描述的数组。否则不确定你拿到钥匙的位置。

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