Опциональное сочетание параметров фильтра в поиске по Rails - PullRequest
1 голос
/ 03 июня 2010

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

В моем контроллере я хочу сделать что-то вроде этого:

def index
  conditions = {}
  conditions[:status] = params[:status] if params[:status] and !params[:status].empty?
  conditions[???] = ["(descr = ? or title = ?)", params[:q], params[:q]] if params[:q] and !params[:q].empty?
  @items = Item.find(:all, :conditions => conditions)
end

К сожалению, не похоже, что я могу смешать два типа условий (хэш и парализованная версия). Есть ли «Rails Way» для этого или мне просто нужно сделать что-то ужасное, как это:

has_status = params[:status] and !params[:status].empty?
has_text = params[:q] and !params[:q].empty?
if has_status and !has_text
   # build paramatized condition with just the status
elsif has_text and !has_status
   # build paramatized condition with just the text query
elsif has_text and has_status
   # build paramatized condition with both
else
   # build paramatized condition with neither
end

Я мигрирую из Hibernate и Criteria, так что прости меня, если я не думаю об этом правильно ...

Среда: Rails 2.3.4

Ответы [ 3 ]

2 голосов
/ 03 июня 2010

Вы можете смешивать условия хеша и массива, используя области действия:

hash_conditions = {}
# build hash_conditions

items_scope = Item.scoped(:conditions => hash_conditions)

unless params[:q].blank?
  items_scope = items_scope.scoped(:conditions => ["(descr = ? or title = ?)", params[:q], params[:q]])
end

...

items = items_scope.all

Таким образом, вы можете смешивать и сопоставлять любые типы условий, и запрос будет выполняться только тогда, когда вы выполните items_scope.all

0 голосов
/ 03 июня 2010

Лучший поиск с моей стороны обнаружил нечто, называемое "именованные области видимости", которое выглядит как раз то, что я ищу. Я собираюсь посмотреть, будет ли он работать с гемом will_paginate ....

Ссылка: http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/

0 голосов
/ 03 июня 2010
a=[],b=[]
unless params[:status].blank?
  a << "status = ?"
  b << params[:status]
end
unless params[:q].blank?
  a << "(descr = ? or title = ?)"
  b << params[:q] << params[:q]
end
@items = Item.all( :conditions => [a.join(" AND "), b] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...