2011-01-02 3 views
0

Я знаю, что я могу искать запросы по телефону where() на модели следующим образом: Post.where(:title => 'My First Post')Как выполнить поиск в Rails3?

Но что, если я не знаю, если пользователь хочет, чтобы отфильтровать параметры поиска? Например, у меня есть форма поиска, которая имеет необязательное поле title. Если заголовок заполнен, форма должна искать заголовок. Однако, если это не так, форма должна просто вернуть все поля.

я пытался делать что-то вдоль линий

search = Post.all 
if params[:title].present? 
    search.where(:title => params[:title]) 
end 

Однако, Rails immidiately возвращает результат поиска, когда я называю POST.All и я не могу дальше добавлять условия/

Как мне делать это?

Спасибо!

ответ

1

.all является методом «финишера» для isl и вызывает запрос, который на самом деле должен быть вызван (то же самое относится к .each и .first). Таким образом, если вы хотите иметь возможность наращивать область условно, .all должно быть последним, что называется, если вы хотите назвать его вообще.

+0

Тогда как бы получить ресурс без извлечения полей, чтобы я мог продолжать называть условия на нем? Благодаря! –

+0

Одним из вариантов является установка 'search = Post.unscoped' или' search = Post.scoped', который оставит вас с отношением isl для воспроизведения. В качестве альтернативы, переосмыслите то, как вы условно добавляете области и пытаетесь справиться с этим более изящно в модели. – idlefingers

1

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

@posts = params[:title].present? ? Post.where(:title => params[:title]) : Post.all 

... потому что когда is no: where scope scope, вы не могли бы потом связать его: все равно.

+0

Правильно, но это был всего лишь пример. Представьте, что мне, возможно, придется называть 5 различных условий в зависимости от ввода пользователя. Как я могу получить ресурс без вызова '.all', чтобы я мог продолжать называть условия на нем? Благодаря! –

+0

Хорошо. Поэтому вы можете начать с post_query = Post.scoped, а затем построить поверх этой базовой области, например. post_query = post_query.where (: title => params [: title]) и т. д. – Scott