Добавление дополнительных атрибутов сортировки в массив записей, затем сортировка!

Допустим, я запускаю запрос ActiveRecord, и он возвращает 3 результата с кучей атрибутов.

Я хочу добавить 3 атрибута к каждой записи в массиве, чтобы я мог выполнять сортировку на уровне кода. Эти 3 включают: num_comments, num_views, last_view.

  1. Как добавить эти атрибуты?
  2. Как мне отсортировать записи в порядке старшинства по num_comments И по num_views И по last_view?

person keruilin    schedule 17.06.2010    source источник


Ответы (2)


Расширяя ответ Ларри К. и комментарий zed_0xff, зачем вообще создавать атрибуты, просто отсортируйте по методу в вашей модели:

class Widget < ActiveRecord::Base
  def num_comments
    #count comments
  end

  def num_views
    #count views
  end

  def last_view
    #return last view
  end
end

в вашем контроллере

class WidgetsController < ApplicationController
  def index
    @widgets = Widget.all.sort_by{ |r| [r.num_comments, r.num_views, r.last_view] }
  end
end
person Patrick Klingemann    schedule 17.06.2010
comment
Главное, на что следует обратить внимание, это НЕ пересчитывать значения (num_comments и т. д.) каждый раз, когда вызываются методы (num_comments и т. д.). Поскольку эти методы будут вызываться много раз во время сортировки, их значения необходимо кэшировать. Использование переменных экземпляра явно гарантирует это. Я согласен с вами, что вычисление значений, вероятно, должно выполняться внутри модели, а не извне. - person Larry K; 17.06.2010
comment
Аааа, хорошая мысль, я даже не подумал об этом. Я немного реорганизую свой ответ. - person Patrick Klingemann; 17.06.2010

person    schedule
comment
сортировку можно оптимизировать до простых sorted_results = results.sort_by{ |r| [r.num_comments, r.num_views, r.last_view] } - person zed_0xff; 17.06.2010