2010-11-30 3 views
2

permet de dire que j'ai un tableau de content_categories (content_categories = user.content_categories)Ruby on Rails: Array Hash avec (clé, tableau de valeurs)

Je veux maintenant ajouter tous les éléments appartenant à une certaine catégorie à content_categories avec la catégorie comme une clé et les identifiants-éléments de contenu comme des éléments d'un ensemble

en PHP quelque chose comme ceci est possible:

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

est-il un moyen facile dans des rails pour le faire?

Greets,

Nico

+0

Il serait utile si vous fournissiez quelques exemples de valeurs et ce que vous voulez voir après avoir traité le tableau. –

Répondre

4

Votre question n'est pas vraiment une question Rails, c'est une question générale de programmation Ruby.

Votre description n'est pas très claire, mais d'après ce que je comprends, vous voulez regrouper les ID pour les catégories communes en utilisant un hachage. Il existe d'autres façons de le faire, mais cela est facile à comprendre ::

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]} 

J'utilise un tableau simple, avec une catégorie, suivi d'un simple hachage représentant une instance d'objet, car il rend facile visualiser. Si vous avez un objet plus complexe, remplacez les entrées de hachage par ces objets et ajustez comment vous accédez à l'ID dans la ligne ternaire (?:).

En utilisant 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() pourrait probablement réduire encore plus, mais mon cerveau est la décoloration. Pour cette solution, content_categories doit être un hachage, pas un tableau comme vous l'avez décrit.

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

Je suppose que cela fonctionne

0

Si je comprends bien, content_categories est un tableau de catégories, qui doit être transformé en un hachage de catégories et leurs éléments.

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 

C'est la version longue, que vous pouvez également écrire comme

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

J'utilise 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

Pas vraiment la bonne réponse, parce que vous voulez IDs dans votre tableau, mais je l'affiche de toute façon, parce que c'est court et agréable, et vous pourriez effectivement sortir avec elle:

content_categories.group_by(&:category) 
0

Sinon, ne savez pas où vous obtenez la clé.

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