Rails 3 ActiveRecord: "ИЛИ-ИНГ" вместе несколько bools - PullRequest
0 голосов
/ 16 июня 2011

У меня есть объект ActiveRecord RaceCarDriver.Три поля являются логическими: is_from_texas, is_from_arkansas и is_from_indiana.В пользовательском интерфейсе поиска пользователь не может выбрать ни один, чтобы увидеть все результаты, выбрать is_from_texas, чтобы увидеть только драйверы из Техаса, или выбрать is_from_texas и is_from_indiana, чтобы просмотреть все драйверы из одного из этих состояний.

Теперь я знаю, что этот пример немного надуманный, но я хотел избежать сложности реального приложения.

Моя лучшая попытка заключается в следующем:

@drivers = RaceCarDriver.select('name').
where(params[:check_texas] == 0 || :is_from_texas => params[:check_texas]).
where(params[:check_arkansas] == 0 || :is_from_arkansas => params[:check_arkansas]).
where(params[:check_indiana] == 0 || :is_from_indiana => params[:check_indiana])

Однако,это ANDS объединенные в цепочку where предложения, так что если бы Техас и Индиана были оба проверены, водитель должен был быть из обоих штатов.

Опять же, я знаю, что это надумано.Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 16 июня 2011
RaceCarDriver.select('name').
where("is_from_texas = ? OR is_from_arkansas = ? OR is_from_indiana = ?",params[:is_from_texas],params[:is_from_arkansas],params[:is_from_indiana])
0 голосов
/ 16 июня 2011
@drivers = RaceCarDriver.select('name')
@drivers = @drivers.where(:is_from_texas => params[:check_texas]) if params[:check_texas]
@drivers = @drivers.where(:is_from_arkansas => params[:check_arkansas]) if params[:check_arkansas]
@drivers = @drivers.where(:is_from_indiana => params[:check_indiana]) if params[:check_indiana]

РЕДАКТИРОВАТЬ

Решение 1:

where_options = { :is_from_texas => params[:check_texas],
                  :is_from_arkansas => params[:check_arkansas],
                  :is_from_indiana => params[:check_indiana] }.select{|k,v| v.present? }
where_conditions = where_options.map{|k,v| "#{k} = #{v}"}.join(" OR ")
@drivers = RaceCarDriver.select('name').where(where_conditions)

Решение 2:

@scoped_drivers = RaceCarDriver.select('name')
@drivers = []
@drivers << @scoped_drivers.where(:is_from_texas => params[:check_texas]) if params[:check_texas]
@drivers << @scoped_drivers.where(:is_from_arkansas => params[:check_arkansas]) if params[:check_arkansas]
@drivers << @scoped_drivers.where(:is_from_indiana => params[:check_indiana]) if params[:check_indiana]
@drivers.flatten!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...