How to use group with scope when joining 3 tables

15 views
Skip to first unread message

Javix

unread,
Nov 20, 2012, 7:01:06 AM11/20/12
to rubyonra...@googlegroups.com
I have the following models:

class Client < ActiveRecord::Base
  has_many :accounts, dependent: :destroy
end

class Account < ActiveRecord::Base
  belongs_to :client
  has_many :operations, dependent: :destroy
end

class Operation < ActiveRecord::Base
  belongs_to :account
end

I manage to extract clients and all their operations grouped by client as follows:

scope :operations_by_client, joins(:client, :operations).select('clients.firstname, clients.lastname, sum(operations.total) as total').group('clients.id, clients.firstname, clients.lastname').order('clients.lastname')

Now how to tune/change it in case if I don't need to calculate SUM of the operations but to use a special method that would calculate the sum of all the operations for the specified client? I mean that I should exclude certain total values from the calculation depending on the operation type.

Thanks and regards

Javix

unread,
Nov 20, 2012, 9:00:47 AM11/20/12
to rubyonra...@googlegroups.com
Finally I implemented ut as follows:

class Client < ActiveRecord::Base
...
  scope :accounts_sum, includes(:accounts => :operations).group('clients.id').order('clients.lastname') 

  def accounts_balance
      accounts.map(&:balance).inject(:+) unless accounts.empty?     
  end
end

And here are the changes in the OperationsController:

def index       
    @operations = Client.accounts_sum.paginate(page: params[:page])
    @total = @operations.map(&:accounts_balance).inject(:+) unless @operations.empty? #to be able to display the total of all the existing accounts.
  end

HTH
Reply all
Reply to author
Forward
0 new messages