Фильтрация отображаемых записей по форме ввода - PullRequest
1 голос
/ 26 января 2011

Я очень новичок в программировании и застрял ... снова,

Я использую рельсы 3, и в настоящее время у меня есть модель места, где каждое место принадлежит области, и тип (каждый из которых является их собственной моделью), все места в базе данных отображаются на странице индекса в разделах, отображающих Название места, а также его площадь и тип.

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

Я попытался установить sphinx и think_sphinx, но не могу заставить их работать на моих Windows 7. Я получил ошибку 1067 при запуске службы и «Не удалось запустить поисковый демон». из think_sphinx на rake ts: start, который, как я предполагаю, происходит из-за того, что служба не запущена, поэтому я надеюсь, что ответом на это не будет сфинкс.

Я посмотрел на прицелы и думаю, что это может быть путь? Хотя у меня нет первой идеи относительно того, как включить раскрывающийся список для выбора необходимой области или действительно, как написать область, которая будет удовлетворять виду фильтра, который я хочу.

Большое спасибо за любую помощь, она очень ценится!

Ответы [ 3 ]

1 голос
/ 26 января 2011

В вашем контроллере вы можете сделать что-то простое:

@filtered_venues = Venue.where(:area => params[:venue][:area], :type => params[:venue][:type]).all

Это должно дать вам отфильтрованные результаты, которые вы хотите.

И тогда, по вашему мнению, вы сможете использовать помощники по формам для создания выбранных элементов:

select("venue", "area", ['New York', 'London', 'Amsterdam'], {}, { :prompt => 'Select Area' })
select("venue", "type", ['Pub', 'Outdoor', 'Hall'], {}, { :prompt => 'Select Type' })

Должен вывести что-то вроде:

  <select name="venue[area]">
    <option value="">Select Area</option>
    <option value="New York">New York</option>
    <option value="London">London</option>
    <option value="Amsterdam">Amsterdam</option>
  </select>
  <select name="venue[:type]">
    <option value="">Select Type</option>
    <option value="Pub">Pub</option>
    <option value="Outdoor">Outdoor</option>
    <option value="Hall">Hall</option>
  </select>

Существует множество других способов динамического добавления параметров, если у вас есть готовые коллекции для области или типа. Проверьте следующее для получения дополнительной информации: http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html

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

Вы можете сделать это несколькими способами, в зависимости от того, как именно вы хотите фильтровать.Лучше всего встроить фильтр в вызов .find(:conditions => ...) и позволить базе данных выполнять тяжелую работу.Если вы заранее не знаете, по каким параметрам вы собираетесь фильтровать, это проще, но менее эффективно сделать в коде.Предполагая, что у вас есть параметры поиска venue_area и venue_type, вы можете сделать что-то подобное в контроллере:

def index
  @venues = Venue.all # Or whatever criteria you might have here
  @venues = @venues.select { |v| v.area_id == params[:venue_area] } if !params[:venue_area].blank?
  @venues = @venues.select { |v| v.type_id == params[:venue_type] } if !params[:venue_type].blank?
  ...
end

Затем вы создаете выпадающие списки, содержащие все типы и идентификаторы областей в форме поиска.Для этого вы можете использовать несколько помощников, например select_tag.Конечно, @options будет лучше заполняться в контроллере, но это показывает более ясные отношения:

<form method="get">
<% @options = Area.all.map { |a| [ a.name, a.id ] } %>
<%= select_tag("venue_area", options_for_select(@options)) %>
<input type="submit" value="Filter" />
</form>
0 голосов
/ 26 января 2011

Этот тип фильтрации может быть выполнен в JavaScript, Ruby или обоих.

Если HTML сам содержит все метаданные, необходимые для определения того, какие элементы соответствуют каким фильтрам, то это можно сделать полностью вJavaScript, скрывая и показывая элементы в ответ на изменение формы.

Если пользователю необходимо нажать кнопку «Отправить», чтобы его выбранные фильтры вступили в силу, тогда форму можно просто отправить, и вы можете снова заполнитьформа на стороне сервера с Rails.

Если в HTML нет всех метаданных и вы не хотите, чтобы они отправляли форму, вы можете использовать AJAX для отправки выбранных фильтров обратноВ конце, пусть Rails создаст новую форму и отправит ее обратно клиенту, а затем использует JavaScript для обновления внешнего интерфейса.

Вы можете получить несколько идей из эпизода Railscasts Поиск, сортировка, разбиение на страницыс AJAX .Это не совсем ваша ситуация, но она может указать вам верное направление для того, как эти типы операций работают в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...