2012-10-21 34 views
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>' 

那一定是因爲我的虛擬SELECT COUNT並不像模特屬性來描述?我該如何解決這個問題? thx

回答

0

當您使用Enumerable#inject沒有參數,你的塊將收到前兩個元素第一次迭代,那麼前一個迭代和第三個要素的結果,等

你可以傳遞一個參數#inject告訴他你選擇的值和第一個元素,那麼結果和第二等

你的情況,打電話給你塊(請注意,我用+,而不是+=):

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

有關如何使用Enumerable#inject的更多詳細信息,請參閱http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-inject

2

inject文檔:「如果您沒有明確指定備忘錄的初始值,則使用集合的第一個元素作爲備忘錄的初始值。」所以第一次通過循環,sum的值是一個PollAnswer對象。您需要初始化和:

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

thx,現在我明白了,對於愚蠢的問題抱歉) – sandric