2017-11-19 6 views
-1

私は2つのテーブルを持っています。 1つはアカウント用、もう1つはキーワード用です。私はすべてのキーワードを繰り返し、各キーワードを追加したアカウントIDでグループ分けされたハッシュでそれぞれを保存したいと考えています。以下のコードでは、各キーワードをハッシュに追加していません。たとえば、2つのキーワードエントリを持つアカウントがあります。私のコードは最初のエントリをスキップし、2番目のエントリだけをハッシュに追加します。テーブルを反復処理して各値のハッシュを作成するにはどうすればよいですか?

@keyword_hash = {} 

@account.each do |key, value| 

    @keywords.where(:profile_id => key).each do |keyword| 

    @keyword_hash[key] = keyword.entry 

    end 
end 
puts @keyword_hash 

私はハッシュに特定のアカウントの各キーワードエントリを追加するようにどのように私は上記のコードを変更することができますか?

@keyword_hash [6]を実行し、そのアカウントのkeyword1、keyword2、keyword3などを取得したいと考えています。ありがとう!

+0

私の推測では、あなたがおよそつもりされていることをハッシュに追加し、[KEYWORD1、KEYWORD2、KEYWORD3など]配列を作成し、これは間違っていて、 'group_by'クエリを使いたいと思っています。しかし、あなたが提供した情報では、言うことは難しいです。 – jvillian

+0

あなたの提案をありがとう。 group_byまたはgroupを使用して調べます。 –

答えて

0
@keyword_hash = Hash.new { |hash, key| hash[key] = [] } 

    @keywords.group_by{ |k| k.profile_id }.each do |key,value| 
    @keyword_hash[key] = value.map(&:entry) 
    end 

    puts @keyword_hash 

これ以上の調査を行ったところ、上記の解決策が見つかりました。私はgroup_byに関する@ jvillianの提案を使用しましたが、このarticleがハッシュの初期化方法を教えてくれました。

+1

ネストされた 'each'の代わりに' @keyword_hash [key] = value.map(&:entry) 'を使います。 – mudasobwa

+0

ありがとうございました!私は好奇心が強いです - より簡潔であるため、このコードを使用する方が良いですか?それとも他の理由もありますか? –

+0

'' each'(基本的には繰り返しです)を 'map'という振る舞いで悪用するのは、コードの匂いです。 – mudasobwa

0

は、あなたがやっているのミスはあなたの@keyword_hashハッシュ内の各keyに対して単一の値を格納していることである

@keyword_hash = Hash.new { |h, k| h[k] = [] } 
@account.each do |key, value| 
    @keywords.where(:profile_id => key).each do |keyword| 
    @keyword_hash[key] << keyword.entry 
    end 
end 
puts @keyword_hash 

このコードを試してみてください。したがって、コードが第2の値をアカウントキーに対して書き込む場合、第2の値を追加するのではなく、前の値を置き換えます。

編集:共有デフォルト値に関する修正のための@mudasobwaありがとうございました。

+0

ありがとうございます。残念ながら、これは空のハッシュを返します。 –

+0

'' 'keyword.entry'''をネストしたループの中に入れてみて、実際にネストされたループに入っているかどうか確認しましたか?さもなければ、@keyword_hashに何かがあるはずです – Abdullah

+0

'@ keyword_hash'を呼び出すと、ハッシュは空です。たとえば、 '@keyword_hash [6]'を呼び出すと、すべてのユーザのすべてのキーワードが返されます。 –

0

それは

**

@keyword_hash = {} 
@account.each do |key, value| 
    arr = [] 
    @keywords.where(:profile_id => key).each do |keyword| 
     arr << keyword.entry 
    end 
    @keyword_hash[key] = arr 
end 
puts @keyword_hash 

**

+0

あなたは 'each'を虐待しています(' each_with_object'がそこで行われなければなりません)。上記のスニペットは、いくつかのルビ構文で書かれたPHPコードです。それは絶対に非慣用的です。 – mudasobwa

関連する問題