Rails 4 Sum by Model Method

J3RN picture J3RN · Aug 13, 2014 · Viewed 15.2k times · Source

In my app, I have a User model, with a goal_ytd method, which performs some calculations.

In a controller, I have a variable @users that might be User or an ActiveRecord::Relation of users, and I would like to sum all of the @users's goal_ytds.

My first inclination was:

@users.sum(&:goal_ytd)

Which threw a deprecation warning in both cases because using sum on an ActiveRecord::Relation is going away in Rails 4.1.

So, I changed the code to:

@users.to_a.sum(&:goal_ytd)

Which then threw a NoMethodError because, in a certain circumstance, @users is assigned by @users = User and User has no to_a method.

Assigning @users using @users = User.all throws a deprecation warning because Relation#all is also deprecated.

Is there a way to get all Users as an array? Is there a better way?

Answer

dazonic picture dazonic · Sep 8, 2014

On Rails 4.1

If goal_ydt is a column in the users table:

@users.sum(:goal_ydt)

If goal_ydt is a method in User class:

@users.to_a.sum(&:goal_ydt)