0
poll_answers = PollAnswer.joins(:poll_answer_variant => {:poll_question => :poll}).select("count(poll_answers.user_id) as submits_count, poll_answers.poll_question_id").where("polls.id = 105").group("poll_questions.id, poll_answer_variants.id")

grouped = poll_answers.group_by(&:poll_question_id)

grouped[81].inject{|sum, answer_variant| sum += answer_variant.submits_count}

私が得たものの後:

NoMethodError: undefined method `+' for #<PollAnswer poll_question_id: 81, poll_answer_variant_id: 9>
from /Users/s/.rvm/gems/ruby-1.9.3-p194/gems/activemodel-3.2.7/lib/active_model/attribute_methods.rb:407:in `method_missing'
from /Users/s/.rvm/gems/ruby-1.9.3-p194/gems/activerecord-3.2.7/lib/active_record/attribute_methods.rb:149:in `method_missing'
from (irb):926:in `block in irb_binding'
from (irb):926:in `each'
from (irb):926:in `inject'
from (irb):926
from /Users/s/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.7/lib/rails/commands/console.rb:47:in `start'
from /Users/s/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.7/lib/rails/commands/console.rb:8:in `start'
from /Users/s/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.7/lib/rails/commands.rb:41:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

これは、仮想選択カウントがモデル属性のように記述されていないためである必要がありますか?どうすれば修正できますか?どうも

4

2 に答える 2

2

インジェクトに関するドキュメントから:「メモの初期値を明示的に指定しない場合、コレクションの最初の要素を使用してメモの初期値として使用されます。」したがって、ループを初めて通過するとき、sumの値はPollAnswerオブジェクトです。合計を初期化する必要があります:

grouped[81].inject(0){|sum, answer_variant| sum += answer_variant.submits_count}
于 2012-10-21T19:19:53.423 に答える
0

引数なしで使用する場合Enumerable#inject、ブロックは最初の反復で最初の2つの要素を受け取り、次に前の反復の結果と3番目の要素などを受け取ります。

引数を渡して#inject、選択した値と最初の要素、次に結果と2番目の要素などを使用してブロックを呼び出すように指示できます。

+あなたの場合(私が使用しているのではなく使用していることに注意してください+=):

grouped[81].inject(0) do |sum, answer_variant|
  sum + answer_variant.submits_count
end

使用方法の詳細については、http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-injectを参照してくださいEnumerable#inject

于 2012-10-21T19:22:19.147 に答える