DM-Aggregates provides a reporting API which offers aggregating functions like count, min, max, avg, sum, and aggregate.


Simply require 'dm-aggregates' somewhere before you connect to your data-store and you’re ready to go.


You can issue a totaling query with DM-Aggregates in a couple of ways. First, you can build a totaling query off of your Resource:

  Dragon.count(:homes_destroyed.lte => 12)

Secondly, you can call count off of a pre-build query object.

  Dragon.all(:age.lte => 3).count

Your query will become a totaling query without having to retrieve the objects and total on the retrieved array. These two approaches can be combined as well.

  Dragon.all(:homes_destroyed.lte => 12).count(:rating => 'amateur')

Min, Max

Minimum and Maximum values from fields in your data-store can be retrieved by specifying which property you want to retrieve the value from.


Further conditions to your min and max queries are simply supplied after the property.

  Dragon.min(:homes_destroyed, :battles_won.gte => 20)
  Dragon.max(:homes_destroyed, :title.not => nil, => "%puff%")

Sum, Average

Both sum, and avg work very similarly to min and max.

  Dragon.sum(:toes_on_claw, :is_fire_breathing => true)

  Dragon.avg(:toes_on_claw, :is_fire_breathing => true)


The aggregate method will let you combine all of the other aggregating methods together to retrieve in one call to the data-store. DM-Aggregates adds in a few extra symbol operators in order to enable this.

  Dragon.aggregate(:all.count, :name.count, :toes_on_claw.min,
    :toes_on_claw.max, :toes_on_claw.avg, :toes_on_claw.sum,
  # [
  #   [ 1, 1, 3, 3, 3.0, 3, false ],
  #   [ 2, 1, 4, 5, 4.5, 9, true ]
  # ]

This will compile all of the aggregating queries together and return them in an array of arrays.