2016-10-27 3 views
1

У меня есть форма поиска Rails, которая выполняет динамический запрос. То есть, пользователь вводит поиск, как:Rails SQL-запрос на неизвестном (динамическом) числе запросов с использованием LIKE

(hobby="skiing") OR (gender="male" AND hobby="jogging") 

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

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

query = "hobby LIKE ? OR (gender LIKE ? AND hobby LIKE ?)" 
queries = ["skiing", "male", "jogging"] 

Для следующего запроса:

where(query, queries) 

Однако , общий синтаксис поискового запроса Rails очень ограничен:

where(query, query_1, query_2, query_3) 

I не может заменить аргументы «query_n» таким массивом, как я хочу, без Rails, бросающего ошибку.

NoMethodError (undefined method `where' for ["a", "b", "c"]:Array) 

Попытка splat массив дает ту же ошибку:

where(query, *queries) 

снова:

NoMethodError (undefined method `where' for ["a", "b", "c"]:Array) 

Так что я могу сделать?

EDIT:

Полная функция поиска выглядит следующим образом:

def self.search(search) 
    query = "%#{search}%" 
    if search 
     includes(:games, :jobs) 
     strngs = ["hobby = ? OR name = ? OR gender = ?", "dsfgdsfg", "dsgsdfgsd", "sdfsfsdf"] 
     .where(strngs) 
+1

Можете ли вы дать немного больше информации о том, какая информация отправляется через форму поиска (каждое значение присваивается его атрибуту?)? Кроме того, запросы в массиве всегда находятся в правильном порядке (att_1, att_2 и т. Д.)? –

ответ

1

Что вы хотите сделать, это передать массив в качестве единственного аргумента where, который содержит как запрос и динамический значения. Например:

where(["att_1 LIKE ? OR att_2 LIKE ?", "value1", "value2"]) 

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

Для примера, вместо двух отдельных переменных queries и query, объединить их в одну query переменную:

# A single array with the query AND values 
query = ["hobby LIKE ? OR (gender LIKE ? AND hobby LIKE ?)", "skiing", "male", "jogging"] 

# Run the `where` with a single array as the argument 
YourModel.where(query) 

Это позволит вам запросить БД с неизвестным количеством значений с использованием LIKE.

For reference: Rails where() docs

+0

Это дало ошибку: NoMethodError (undefined method 'where 'for # ): – ineedahero

+0

Вы используете' where' в массиве? Его следует запустить по модели ActiveRecord –

+0

См. Мое редактирование для того, как я ищу – ineedahero