запрос одного выпадающего меню с несколькими выпадающими меню через рельсы - PullRequest
1 голос
/ 31 июля 2011

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

Я относительно новичок в рельсах, и я пытаюсь реализовать запрос на моем сайте. Одна часть моего сайта позволяет пользователям выбирать штат из выпадающего меню при заполнении формы.

Другая часть сайта (часть, реализующая запрос) позволяет пользователям запрашивать форму на основе состояния, связанного с ним. На странице есть только 4 выпадающих списка и кнопка отправки. Этот запрос должен позволять пользователям находить формы из нескольких состояний, выбирая нужные состояния из доступных раскрывающихся меню. Это означает, что пользователь может запрашивать формы из 4 различных состояний, и он будет возвращать все формы, где состояние в форме соответствует состоянию из одного из четырех раскрывающихся меню.

Таким образом, пользователь может выбрать «Джорджия» из штата_1 (название выпадающего списка), «Техас» из штата_2, «Калифорния» из штата_3 и «Огайо» из штата_4. После того, как пользователь отправит свой запрос, я хотел бы вернуть все доступные формы, которые соответствуют выбранным пользователем выпадающим спискам.

В настоящее время я сталкиваюсь с некоторыми проблемами. вот код, который у меня сейчас есть:

 def self.search(params)
    form = self.scoped

    form = form.where(:state => params[:state_1]) if params[:state_1].present?
    form = form.where(:state => params[:state_2]) if params[:state_2].present?
    form = form.where(:state => params[:state_3]) if params[:state_3].present? 
    form = form.where(:state => params[:state_4]) if params[:state_4].present?

    form
  end

Проблема, с которой я сталкиваюсь, заключается в следующем: если я запускаю запрос только с выделением в state_1, то он возвращает все поля, связанные с этим состоянием (что превосходно); однако если я попытаюсь выполнить запрос с вариантами выбора в нескольких раскрывающихся меню (например, «Грузия» в штате_1 и «Техас» в состоянии_2), формы не будут возвращены.

Опять же, я искренне извиняюсь, если это сбивает с толку, и я благодарен за ваше время. Буду признателен за любую помощь, и я сделаю все возможное, чтобы ответить на любые вопросы как можно быстрее. Большое вам спасибо!

1 Ответ

1 голос
/ 31 июля 2011

Если у вас установлены :state_1 и :state_2, то вы будете делать это:

form = form.where(:state => params[:state_1]).where(state => params[:state_2])

И это говорит

state = 'TX' AND state = 'GA'

Каждый раз, когда вы звоните .where, вы добавляете еще одно условие с соединением (т. Е. И). Я думаю, что вы после этого:

states = [:state_1, :state_2, :state_3, :state_4].map { |k| params[k] }.reject(&:blank?)
form = form.where(:state => states) if(!states.empty?)

Это превратится в SQL вроде этого:

state IN ('TX', 'GA')

и это, похоже, то, что вы ищете. map извлечет значения param с для указанных ключей состояния, а затем reject отфильтрует пробелы (т. Е. false, nil, пусто или все пробелы).

...