在轨道上选择计数的未定义'+'方法

时间:2012-10-21 19:12:31

标签: ruby-on-rails ruby activerecord

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>'

一定是因为我的虚拟选择计数不像模型属性那样描述?我该如何解决这个问题? THX

2 个答案:

答案 0 :(得分:2)

来自inject上的文档:“如果你没有明确指定备忘录的初始值,那么使用集合的第一个元素作为备忘录的初始值。”因此,第一次通过循环时,sum的值是PollAnswer对象。你需要初始化总和:

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

答案 1 :(得分: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