2010-11-30 23 views
2

とハッシュへのアレイは、私がcontent_categories(content_categoriesの=のuser.content_categories)の配列を持っていると言うことができますルビー:(キー、値の配列)

私は今まで、あるcategorieに属するすべての要素を追加したいですこのようなPHPの何かに設定された

の要素として、キーとコンテンツ・アイテムIDなどのカテゴリでcontent_categoriesが可能です:

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

は、これを行うためのレールで簡単な方法はありますか?

挨拶し、

ニコ

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

私は、いくつかのオブジェクトのインスタンスを表す簡単なハッシュ続いカテゴリを持つ単純な配列を、使用しています視覚化する。より複雑なオブジェクトを持っている場合は、ハッシュエントリをそれらのオブジェクトに置き換え、3進(?:)行の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()は、おそらく、さらにそれを縮小することができますが、私の脳が退色しています。

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

私はそれが私が正しく理解していれば、content_categoriesカテゴリのハッシュに有効にする必要がありカテゴリの配列であり、そして

0

の作品だと仮定それらの要素。あなたがしたいので、あなたも

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

ないを使用したい

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 

あなたの配列の中のIDですが、とにかくそれは素敵で短いので、私はそれを投稿します。あなたは実際にそれから離れていくかもしれません:

content_categories.group_by(&:category) 
0

このソリューションの場合、content_categoriesはハッシュでなければなりません。記述したとおりの配列ではありません。それ以外の場合は、キーを取得しているか分からない。

contents_by_categories = Hash[*content_categories.map{|k, v| [k, Category.getContents(v.id)]}] 
関連する問題