Модуль Filter Rails 3 использует динамические фильтры, основанные на агрегатах - PullRequest
0 голосов
/ 27 декабря 2010

У меня есть модель, которая включает в себя такие атрибуты, как название компании, дата публикации (дата), местоположение (пара широта / долгота). В представлении «Индекс» я сегментирую набор результатов, используя гем will_paginate.

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

Posted: [ 0 (24) | 30 (51) | 60 (45) | 90+ (555) ]
Company: [ Company X (53) | Company AAA (44) | ... ] 
Locations: [ New York (100) | Paris (51) | ... ]

Я думал об использовании вспомогательной функции для вычисления агрегатов на основе коллекции результатов, но коллекция гема will_paginate (например, @foos) включает в себя только результат текущей страницы. Возможно, есть способ получить доступ ко всему набору результатов.

Полагаю, я мог бы выполнить ряд операторов SQL для вычисления значений частоты каждого фильтра, но я надеялся, что может быть более эффективный способ сделать это.

1 Ответ

0 голосов
/ 04 января 2011

У меня был некоторый успех со следующим подходом:

контроллер:

...
# WHERE clause
@foos = @foos.posted(params[:posted]) if params[:posted].present?

# clone recordset
@companies = @foos.clone

# set ORDER BY / pagination
@foos = @foos.order_by(params[:sort], params[:dir]).paginate(:per_page => Foo.per_page, :page => params[:page])
...

просмотр:

...
Company: [
<% @companies.group_by(&:company_name).sort.each do |company, foos| %>
    <%= "#company.name} (#{foos.length})" %> | 
<% end %>
]
...

Возможно, есть DRYer / more-эффективный способ сделать это.

...