Rails, где LIKE передает динамический атрибут со значениями - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть поисковый запрос, и мне нужно передать атрибут и значения динамического поиска.В следующем запросе я пропускаю все поля, но они не являются динамическими средствами. Некоторое время только имя_первого имени будет в поиске, или некоторое время имя_имя и фамилия или некоторое время имя_первое с возрастом.

Как наилучший способ передать эти атрибуты и значениясогласно найденному в методе поиска.

Product.where(
  'first_name like ? OR last_name like ? OR age BETWEEN ? AND ?',
  params[:first_nm],
  params[:last_nm],
  params[:age_start],
  params[:age_end]
)

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Если вы можете, я обновил бы вашу форму, чтобы представить параметры, отражающие столбцы для поиска.Тогда вы можете сделать это немного проще с помощью области:

ALLOWED_SEARCH_TERMS = %i(first_name last_name).freeze

scope :search, ->(terms) {
  result = all
  terms.slice(*ALLOWED_SEARCH_TERMS).each { |term, value| result = result.where(:"#{term}" => value) }
  result = result.where("age BETWEEN :age_start AND :age_end", terms.slice(:age_start, :age_end)) if terms.key?(:age_start) && terms.key?(:age_end)
  result
}

Тогда в вашем контроллере вы можете:

Product.search(params)
0 голосов
/ 19 декабря 2018

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

params_hash = {}
if first_name
  where_str = 'first_name Ilike :ft_nm'
  params_hash[:ft_nm] = "swapnil"
end

if last_name
  where_str += 'last_name Ilike :lt_nm'
  params_hash[:lt_nm] = "patil"
end 

Product.where(where_str, params_hash)
0 голосов
/ 19 декабря 2018

Эта логика может помочь

level_one_result = Product.where('first_name like ? OR last_name like ?',"%#{params[:first_nm]}%", "%#{params[: last_nm]}%")
if (params[:age_end].to_i > 0 or params[:age_end].to_i > 0)
  if params[:age_start].to_i > 0 and params[:age_end].to_i > 0
     result = level_one_result.where('age >= ? AND age <= ?',params[:age_start].to_i,params[:age_end].to_i)
  elsif params[:age_end].to_i > 0
     result = level_one_result.where('age <= ?',params[:age_end].to_i)
  else
     result = level_one_result.where('age >= ?',params[:age_start].to_i)
  end
else
  result = level_one_result
end
...