Как мне выполнить поиск в Rails3? - PullRequest
0 голосов
/ 03 января 2011

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

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

Я пытался сделать что-то вроде

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

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

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 03 января 2011

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

1 голос
/ 03 января 2011

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

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

... потому что, когда нет области видимости: where, вы не сможете позднее связать ее со: all, в любом случае.

...