Попробуйте это:
Если вы используете Postgres DB
# Postgres
DayFee.sum(:fee, :group => "EXTRACT(MONTH FROM date)")
=> #<OrderedHash {"3" => 5, "5"=> 6, "7"=> 2}
Если вы используете MySQL
DayFee.sum(:fee, :group => "MONTH(date)")
Редактировать
Судя по вашему комментарию, вам нужны другие данные:
Postgres
DayFee.count(:fee, :group => "date_trunc('month', date)").
map{|d, k| Date.parse(d)}.
inject({}){|h, d| h[d.month]=d.year;h}
MySQL
DayFee.count(:fee, :group => "DATE_FORMAT(date, '%Y-%m')").
map{|d, k| Date.parse(d+"-00 00:00")}.
inject({}){|h, d| h[d.month]=d.year;h}
Чтобы получить 2D массив
DayFee.count(:fee, :group => "date_trunc('month', date)",
:order => "date_trunc('month', date) ASC").
map{|d, k| Date.parse(d)}.
map{|h, d| [d.month, d.year]}
# [["03", "2012"], ["03", "2013"], ["03", "2014"]]
Получить хэш с коллекцией лет
DayFee.count(:fee, :group => "date_trunc('month', date)").
map{|d, k| Date.parse(d)}.
inject({}){|h, d| (h[d.month]||=[]) << d.year;h}
# {"03" => ["2012", "2013", "2014"]}