2010-08-17 3 views
2

Я хочу выполнить операцию над массивом, возвращаемым из запроса ActiveRecord. Это функциональность, которую я бы сделал на ActiveRecord напрямую.Ruby-эквивалент группы ActiveRecord по запросу

Modification.find(:all, :group=>'ref_id,start_date', :order=>'updated_at desc') 

Выше работает нормально, как и ожидалось. Но проблема в том, что я не могу выполнить это напрямую по некоторым причинам. Но у меня есть массив. Я не могу использовать символ :group в массиве по той очевидной причине, которая не является ActiveRecord. Но я хотел бы иметь ту же функциональность. Что-то вроде

modifications = Modification.all 
modifications.find(:all, :group=>'ref_id,start_date').sort(:order=>&:updated_at) 

выше не будет работать по понятным причинам, но как сделать подобную реализацию ActiveRecord для массива.

ответ

2

Если вы хотите отсортировать, прежде чем группа:

modifications.group_by{|modification| "#{modification.ref_id}#{modification.start_date}"}.values.collect{|modification_array| 
    modification_array.sort_by{|mod| mod.updated_at}.last 
} 

Если вы хотите отсортировать после:

modifications.group_by{|modification| "#{modification.ref_id}#{modification.start_date}"}.values.map(&:first).sort_by{|mod| mod.updated_at}.invert 

Не проверял :).

+0

Сладкий, не знал, что у рубина была group_by (http://rubybrain.com/api/ruby-1.8.7/doc/index.html?a=M003084&name=group_by). Я думаю, что sort_by должен быть в конечном массиве, т. Е. Результат group_by, а не в отдельных группах (или, возможно, так же хорошо). – Shadwell

+0

Вы правы :) обновил мой ответ –

+0

Nice dude !!! Спасибо вам очень большое спасибо. – bragboy

Смежные вопросы