2016-09-09 6 views
1

を返し続けます。私は楽.each方法でそれを行うことができるが 、私はまた、.inject({})の方法でそれを行う可能性が期待していたが、この方法は、時間の2/3 nilを返します。ルビーを注入は、私はハッシュを返すために、単純なSQLクエリを実行しているNilClass

誰も私が間違ってやっているかを説明することはできますか?

この

はプットが

を返し、これは注入方法

.inject({}) do |hash,elmt| 
    p "hash ==> #{hash}" 
    puts '------------------' 
    if hash[elmt.checker.display_name] 
    hash[elmt.checker.display_name] << elmt.date 
    hash 
    else 
    hash[elmt.checker.display_name] = elmt.date 
    hash 
    end 
end 

ある

CheckerAvailability.availabilities(12)).to eql({ 
    'Clint Eastwood' => [Date.today, Date.today + 1.day], 
    'Bob Morane' => [Date.today + 11.days] 
} 

予想通りのハッシュを返す

def self.availabilities(days=10) 
    hash = {} 
    where(
     'date >= ? AND date <= ?', 
     Date.today, Date.today + days 
    ) 
    .each do |availability| 
     p availability 
     if hash[availability.checker.display_name] 
     hash[availability.checker.display_name] << availability.date 
     else 
     hash[availability.checker.display_name] = [availability.date] 
     end 
    end 
    hash 
    end 

正常に動作します.each方法であります

"hash ==> {}" 
------------------ 
"hash ==> " 
------------------ 
"hash ==> " 
------------------ 

そして、私はそれを反復処理しようとした場合、もちろんそれは動作しません。あなたの助け

ため

おかげで誰もが偉大な一日を!あなたは二つの引数を参照する必要があります

.inject({}) do |hash,elmt| 
    p "hash ==> #{hash}" 
    puts '------------------' 
    if hash[elmt.checker.display_name] 
    hash[elmt.checker.display_name] << elmt.date 
    hash 
    else 
    hash[elmt.checker.display_name] = elmt.date 
    hash 
    end 
end 

+1

ただ、サイドノート:それはあなたが、N + 1のクエリを実行しているように見え、あなたのコードのパフォーマンスは、 'include'やデータベースのjoinを使うことで大幅に改善されるかもしれません。 'checker'はデフォルトの' belongs_to:checker'の関連付けで、 'display_name'はデータベースの列ですか? – spickermann

答えて

1

から各要素です。あなたはブロックパラメータとして要素を扱う必要があることに加えて、あなたはeach_with_objectの代わりinjectを使用する必要があります。別の不具合は、文字列を作成しているときに、それぞれのハッシュ要素が見つからないときに配列を作成する必要があるということです。

(不正なブロックのparamsのほかに)あなたのコード内で間違った
.each_with_object({}) do |elem, hash| 
    (hash[elmt.checker.display_name] ||= []) << elmt.date 
end 

hash[elmt.checker.display_name] = elmt.date 

は次のようになります。

hash[elmt.checker.display_name] = [elmt.date] 
+0

ありがとう、私は最終的にそれを得ると思う...明らかに私はどこにすべきではない注射しようとしている –

0

はこれを試してみてください。まずここ注入、あなたのハッシュから、あなたの引数があり、第二は、冗長中間オブジェクトを生成することによってinjectを乱用し、あなたのループ

+0

あなたの答えをありがとう、私は私の元の質問を編集した、私は元々2つの引数で試してみましたが、まだ動作しません.. –

+0

これはちょうど不完全/間違って、私はそれがどのようにupvotedているのだろうか? – mudasobwa

+0

ここで何が間違っていますか? –

関連する問題