Lee
Lee

Reputation: 8744

Rails more idiomatic way of adding up values

I am working on a survey app, and an Organisation has 0 or more SurveyGroups which have 0 or more Members who take the survey

For a SurveyGroup I need to know how many surveys still need to be completed so I have this method:

SurveyGroup#surveys_outstanding

  def surveys_outstanding
    respondents_count - surveys_completed
  end

But I also need to know how many surveys are outstanding at an organisational level, so I have a method like below, but is there a more idiomatic way to do this with Array#inject or Array#reduce or similar?

Organisation#surveys_pending

   def surveys_pending
      result = 0
      survey_groups.each do |survey_group|
         result += survey_group.surveys_outstanding
       end
      result
   end

Upvotes: 0

Views: 41

Answers (2)

sailor
sailor

Reputation: 8034

Try this:

def surveys_pending
  @surveys_pending ||= survey_groups.map(&:surveys_outstanding).sum
end

I'm using memoization in case it is slow to calculate

Upvotes: 2

sawa
sawa

Reputation: 168179

def surveys_pending
  survey_groups.inject(0) do |result, survey_group|
     result + survey_group.surveys_outstanding
  end
end

Upvotes: 0

Related Questions