Найти по условиям с * подстановочными знаками - PullRequest
3 голосов
/ 24 января 2012

У меня есть форма поиска с двумя параметрами.Если параметр пуст, я бы хотел найти все.

var_1 = params[:var_1].blank? ? "*" : params[:var_1]
var_2 = params[:var_2].blank? ? "*" : params[:var_2]

@mymodels = MyModel.find(:all,:conditions=>["var_1 = ? and var_2 = ?",var_1,var_2])

Вот что я получил:

SELECT ... WHERE (var_1 = '*' and ...

Мне нужно:

SELECT ... WHERE (var_1 = * and ...

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 24 января 2012

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

conditions = []
values = []
[:var1, :var2].each do |field|
  unless params[field].blank?
    conditions << "#{field} = ?"
    values << params[:field]
  end
end

и затем запустите find:

MyModel.find(:all, :conditions => [conditions.join(" AND "), values])
0 голосов
/ 25 января 2012

Я бы посмотрел на создание модифицируемого запроса, так как arel построен на этой идее.

Например,

query = Model.scoped
query = query.where(:var1 => params[:var1]) if params[:var1].present?
query = query.where(:var2 => params[:var2]) if params[:var2].present?
... more conditions
@models = query.all # returns the array, finally

Я использовал Model :: scoped здесь, чтобы продолжить мои поиски, потому что это возвращает объект ActiveRecord :: Relation, а не массив как Model.all будет.

Я считаю полезным начать широкий поиск, а затем сузить его.

Надеюсь, это поможет,

1012 * Люк *

0 голосов
/ 24 января 2012

Полагаю, что SELECT ... WHERE (var_1 = * and ... не сработает в любом случае, так как то, что вам нужно, это предложение вроде

Пример: SELECT ... WHERE var_1 like '%' and ...

Так что один вариант должен быть, есть отдельный метод:

Пример:

def mymodel_list(var1, var2)
  @mymodels = nil
  if var1 && var2
    @mymodels = MyModel.find(:all,:conditions=>["var_1 = ? and var_2 = ?",var_1,var_2])
  else
    @mymodels = MyModel.find(:all) 
  end  
  @mymodels
end

ИМО, иногда лучше написать больше кода, чтобы логикой можно было легко управлять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...