Есть ли способ объединить несколько предложений where с внутренними операторами if в Ruby on Rails? - PullRequest
1 голос
/ 03 июня 2019

Я новичок здесь и новичок в рельсах.В настоящее время я пытаюсь создать собственную функцию поиска по базе данных (книгам) моего учебного проекта.Я не хочу реализовывать существующую форму поиска, потому что я просто хочу учиться.Пока это работает, но теперь я добавил выпадающее меню, чтобы выбрать символ сравнения.Исходя из этого, он найдет книги с рейтингом ("==", "> =" или "<="). </p>

Я попытался установить предложения if перед целой частью where, но это означает, что янужно было бы все где-часть три раза.Я надеялся, что есть более короткий способ достичь этого?Заранее спасибо!

def self.advanced_search(s_name, s_author, s_comp_sign, s_rating)  

  where("lower(name) LIKE ?", "%#{s_name}%").  
  where("lower(author) LIKE ?", "%#{s_author}%").  
  where(:rating == s_rating) #if s_comp_sign == "="
  where(:rating >= s_rating) #if s_comp_sign == ">"
  where(:rating <= s_rating) #if s_comp_sign == "<"

end

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Так как вам нужно сделать, когда запрос по тому же полю в соответствии с выбранным пользователем оператором, вы можете сделать это следующим образом:

Метод 1:

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

def operator_chosen(op)
  case op
  when '>'
    '>='
  when '<'
    '<='
  when '='
    '=='
  else
    '<>'
  end
end

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

where("rating #{operator_chosen(s_comp_sign)} s_rating") if s_comp_sign.present?

Метод 2:

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

op = (s_comp_sign == '>' ? '>=' : (s_comp_sign == '<' ? '<=' : '=='))

Здесь по умолчанию будет ==, а затем это можно использовать как:

where("rating #{op} s_rating") if s_comp_sign.present?
0 голосов
/ 03 июня 2019

Одним из способов избежать этого будет создание сохранения условия в строке перед запросом данных.

Например: rating_condition = "rating " + s_comp_sign + " ?"

и последующий запрос следующим образом: where("lower(name) LIKE ?", "%#{s_name}%").<br> where("lower(author) LIKE ?", "%#{s_author}%").<br> where(rating_condition,s_rating)

...