简体   繁体   中英

How to perform single sql query to sum columns from grouped results in activerecord?

I have two models - Parent and Params , where parent has_many params

Currently, my methods looks like (not that it is under Parent class):

def total_sum
  params.select(
    'params.*, (
      SUM(mono_volume_annular) + 
      SUM(day_volume_annular) + 
      SUM(night_volume_annular) + 
      SUM(exclusive_volume_annular)
    ) AS summed_volume_annular'
  ).group('params.id').sum(&:summed_volume_annular)
end

How can I improve this SQL query to get rid of .sum(&:summed_volume_annular) method call?

If I'll try to summarize it without converting :summed_volume_annular to proc, I'll get this error: ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "summed_volume_annular" does not exist

An interesting note - If I'll try to save the result of this query

params.select('(
    SUM(mono_volume_annular) + 
    SUM(day_volume_annular) + 
    SUM(night_volume_annular) + 
    SUM(exclusive_volume_annular)
  ) AS summed_volume_annular'
)

I will get this object [#<Parameter:0x00000009f1c7d8 id: nil>]

Strange that summed_volume_annular is absent...

I would do something like this:

def total_sum
  columns_to_sum = %w(mono_volume_annular day_volume_annular night_volume_annular
                      exclusive_volume_annular)
  sum = columns_to_sum.map{ |col| "COALESCE(#{col}, 0)" }.join(' + ')
  Params.sum(sum)
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM