Так же, как к вашему сведению... Вложенные транзакции могут быть опасными. Это просто увеличивает возможности получения мертвой блокировки. Так, хотя это хорошо и необходимо, способ, которым это реализовано, важен в более высокой ситуации с объемом.
Исправлено с помощью: select при получении запроса, ввод выборок вручную
@hours = Hour.all(:conditions => "user_id = "+ @user.id.to_s,
:select => "created_at, SUM(time) time",
:group => "strftime('%m', created_at)",
:order => 'created_at DESC')
Для этого можно использовать вычисления активной записи . Некоторый пример кода может быть
Model.sum(:column_name, :group => 'MONTH("created_at")')
. Очевидно, с оговоркой, что МЕСЯЦ зависит от MySQL, поэтому, если вы разрабатываете базу данных SQLite, это не сработает.
Я не знаю, есть ли SQL-запрос, который вы используете для этого (без изменения текущей структуры таблицы). Однако вы делаете это с помощью нескольких строк кода.
records = Tasks.find(:conditions => {..})
month_groups = records.group_by{|r| r.created_at.month}
month_groups.each do |month, records|
sum stuff.. blah blah blah..
end
Я видел эту ссылку справа от этого вопроса. Я предполагаю, что другие базы данных, помимо MySQL, имеют аналогичные функции.