假设我有一个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中有一种简单的方法可以做到这一点吗?
迎接,
尼科
答案 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)
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)]}]