Дополнительное соединение параметров фильтра в поиске направляющие путь

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

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

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

К сожалению, не похоже, что я могу смешать два типа условий (хеш и paramatized версия). Есть ли "направляющие Способ" выполнения этого, или сделайте я просто должен сделать что-то ужасное как это:

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

Я мигрирую от, в спящем режиме и Критерии, так простите мне, если я не думаю об этом правильно...

Среда: направляющие 2.3.4

1
задан GSP 2 June 2010 в 21:54
поделиться

3 ответа

Вы можете комбинировать условия хэша и массива, используя области:

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

2
ответ дан 3 September 2019 в 00:06
поделиться

При более тщательном поиске с моей стороны было обнаружено что-то под названием «именованные области», что, похоже, именно то, что я ищу. Я собираюсь посмотреть, будет ли это работать с гемом will_paginate ....

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

0
ответ дан 3 September 2019 в 00:06
поделиться
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] )
0
ответ дан 3 September 2019 в 00:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: