2017-04-24 3 views
0

私の投票モデルの結果をさらにハッシュに入れようとしましたが、Rubyの変数からハッシュキーを作成する方法がわかりません。下の例を参照してください:どのように私は変数がtarget_hash[cv.content_id]を認識することがないことができます、モデルの結果をキーの問題としてハッシュ変数に変換する

undefined method `member?' for nil:NilClass

が、それは認識されないtarget_hash[cv.content_id]から来ている??:

def create_hash_array(campaign_votes) 
     target_hash = Hash.new 
     campaign_votes.each_with_index do |cv,i| 
      target_hash[cv.content_id] = {} if i == 0 

      if target_hash[cv.content_id].member?(cv.vote_button_id) 
      target_hash[cv.content_id][cv.vote_button_id] = (target_hash[cv.content_id][cv.vote_button_id]).to_i + 1 
      else 
      target_hash[cv.content_id] = {cv.vote_button_id => nil} 
      end 

     end 
     target_hash 
    end 

通常、私はエラーを得ました

+0

'target_hash [cv.content_id]'はまだ設定されていないキー 'cv.content_id'を使ってハッシュから値を取得しようとします.nilであり、' member'を呼び出しています。基本的には 'cv.vote_button_id'キーがあればハッシュをネストしたいのですか? –

答えて

3

私はあなたのコードは、これに煮詰めことができると思う:

def create_hash_array(campaign_votes) 
    target_hash = Hash.new { |h,k| h[k] = Hash.new(0) } 

    campaign_votes.each do |cv| 
    target_hash[cv.content_id][cv.vote_button_id] += 1 
    end 

    target_hash 
end 

すべてのプロセスに巻き込ま取得して行うことが多く、ここで複数の問題が、あります。 target_hash構造体の要素は、0のインデックス位置でのみ初期化されますが、campaign_voteの各値はcontent_idという値が異なる可能性があります。

このアプローチでは、カウンタハッシュでキーを設定するハッシュが1つ生成されます。ハッシュはデフォルトで0に設定されているため、いつでもナビゲートすることができ、デフォルトのため+= 1が機能します。

このアプローチは、Rubyではかなり一般的です。特にHash.new(0)は、任意のオブジェクトの単純なカウンタを処理するのに非常に便利です。

関連する問題