Как добавить параметры фильтра столбцов в поле зрения (делая это "путем рельсов") - PullRequest
0 голосов
/ 12 марта 2012

Я ищу рабочее решение для довольно простой проблемы, но не могу найти хорошее объяснение.

То, что у меня сейчас (работает), это индексное представление, которое содержит:

  • форма для ввода нового элемента и
  • список существующих элементов с разбивкой по страницам (используя will_paginate).

Для списка меня интересует только часть данных, поэтому я пытаюсь добавить форму с параметрами фильтра и хочу сохранить содержимое форм в файле cookie (который следует заменить на сохраняемый объект для каждого пользователя). в базе данных, но у меня еще нет пользователей). Я не могу понять, как получить значения из формы, хранящейся в куки (и наоборот), и как использовать ее вместе с will_paginated.

То, что я сейчас пытался сделать в качестве первого шага, - это создать объект @filter в моем контроллере и добавить форму фильтра для этого объекта, настроив параметры формы для повторного использования контроллера индекса. Это приводит к тому, что выбранные параметры фильтра передаются в хэше params контроллеру индекса (отображается в URL). Но у этого решения есть некоторые недостатки. во-первых, фильтры исчезают, как только я меняю представление (например, путем создания нового элемента), а во-вторых, вместо этого объект @filter должен быть файлом cookie.

Вот код, который у меня есть:

частичное представление для фильтра:

<%= form_for(@filter, :url => {:action => "index"}, :html => {:method => :get}) do |f| %>
  <div class="field">
    <%= f.label :german %><br />
    <%= f.check_box :german %>
  </div>
  <div class="actions">
    <%= f.submit "Filter" %>
  </div>
<% end %>

Контроллер:

def index
  @word = Word.new
  @filter = Word.new(params[:word])
  @words = Word.paginate(:page => params[:page]).order('word')
  # ....

Кто-нибудь может мне помочь? Как такая функциональность (фильтрация результатов) выполняется в других приложениях?

1 Ответ

0 голосов
/ 15 марта 2012

Таким образом, ответ на этот вопрос заключается в том, что используйте условие where, чтобы включить в свой результат только совпадающие записи.

@words = Word
  .where("german = ?", params[:word][:german] != 0")
  .order('word')
  .paginate(:page => params[:page])

Это новый синтаксис Rails под названием Active Relation (сокращенно AREL), которыйобычно следует заменить старые методы find и find_by.Он имеет несколько преимуществ, которые могут повысить производительность, в частности, то, что исполняемый SQL (который вы можете видеть в своих журналах) появляется только тогда, когда на него ссылаются, а не когда он объявляется.Это дает вам удобные способы определения частичных отношений (даже именованных областей), которые вы можете создать для создания более простых операторов, которые объединяются вместе.

Порядок различных предложений не имеет значения - AREL сгенерируеттот же SQL, но обычно мне нравится следовать порядку базового SQL,

  • , где
  • объединяет
  • группу
  • порядок
  • limit
  • offset

(предел и смещение обрабатываются в вашем случае инструментом нумерации страниц).

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