Rails: объединение необязательных параметров в запрос - PullRequest
2 голосов
/ 06 ноября 2010

У меня есть представление с огромным разбитым на страницы списком записей, которые необходимо фильтровать.

Пользователи могут фильтровать по записям несколькими различными способами (такими как «сохраненные» записи, «прочитанные» записи и «пометка удаленных»).«записи») и я бы хотел, чтобы они могли комбинировать эти фильтры любым возможным способом.

Мой текущий, некорректный, неработающий подход.Приведенный ниже код ничего не дает, если все параметры не указаны и действительны:

#view. Set the 'se' filter to true; leave all others as is 
<%= link_to list_url(:id=>params[:id], :se=>"true", :st=>params[:st], :re=>params[:re]) do %> 
  <div class="button">Toggle SE</div>
<% end %>

#controller query. Add whichever params are passed into the conditions for the new page.
#query is paginated and sorted
@records = Record.where("user_id IN (?) AND see = ? AND star = ? AND delete = ? AND like = ?", @users.select("id"), params[:se], params[:st], params[:re]).paginate :page => params[:page], :order => (sort_column + " " + sort_direction)

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

Ответы [ 2 ]

4 голосов
/ 06 ноября 2010

Попробуйте это:

conditions = {:user_id => @users.select("id")}
{
 :se => :see,
 :st => :star,
 :del => :delete
}.each{|k1, k2| conditions[k2] = params[k1] unless params[k1].blank?}

@records = Record.where(conditions).paginate(...)

Хеш conditions будет заполнен на основе значений, присутствующих в хеше params.

Редактировать 1

Вы можете объединить условия хеш и массив.

@records = Record.where(conditions).where(
  ":created_at > ?",  Date.today - 30).paginate(...)

Вы можете изменить условие user_id на любое, указав

conditions[:user_id] = @user.id

В приведенном выше утверждении, если RHS является массивом, rails автоматически генерирует предложение IN. В противном случае выполняется проверка равенства (=).

0 голосов
/ 01 февраля 2011

Также можно использовать анонимные области: Объединять массивы условий в Rails

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