У меня есть простая страница списка с несколькими поисковыми состояниями фильтров, которые являются простым перечислением и тестовым запросом, который я хочу сравнить и с полем заголовка и с описания своей модели.
В моем контроллере я хочу сделать что-то вроде этого:
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
Вы можете комбинировать условия хэша и массива, используя области:
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
При более тщательном поиске с моей стороны было обнаружено что-то под названием «именованные области», что, похоже, именно то, что я ищу. Я собираюсь посмотреть, будет ли это работать с гемом will_paginate ....
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] )