2016-10-28 4 views
1

У меня есть веб-приложение, где я хочу, чтобы обеспечить расширенный поиск, в котором пользователь вводит произвольное количество запросов, соединенные И и/или ИЛИ, вроде этого:Rails Gem для Поиск

(введенный в поле поиска на веб-странице)

name = "john" OR (occupation = "gardener" AND hobby.main = "reading") 

в предыдущем post я успешно реализовала систему, в которой я непосредственно преобразовывать запросы, отформатированные как указано выше, в допустимых операторов SQL, и кормить их прямо в SQL для запроса к базе данных.

Это работало, но теперь я беспокоюсь о трех вещах:

  1. Это навлекает инъекции SQL
  2. Если ввод пользователя недействителен SQL выдает ошибку, которая не очень красиво ... были некоторые устраняя эти исключения (хотя эта часть выполнима).
  3. Код просто кажется действительно взломанным, и мне интересно, есть ли лучший способ.

Ну, я слышал, что есть лучший способ, используя поисковые камни.

Однако у меня возникли проблемы с поиском драгоценных камней, которые соответствуют моим потребностям. Многие из драгоценных камней кажутся toocomplex за то, что мне нужно, и ничто из того, что я нашел, не дало понять, как именно вы можете реализовать именно то, что я ищу, - где пользователь вводит динамическое число запросов, связанных с AND/OR заявления.

Точно, как дорого стоить просто преобразовать оператор прямо в синтаксис SQL и ввести его прямо, как я делаю прямо сейчас? Насколько легко включить один из этих драгоценных камней для чего я хочу? Что бы сделал опытный разработчик Rails? Я полный noobie для Rails, поэтому у меня нет опыта в этом.

ответ

0

Существует поиск камень называется Ransack

Что позволяет искать модели в очень простой способ:

<%= f.search_field :name_or_description_or_email_or_articles_title_cont %> 

В приведенном выше примере это метка при нажатии Виль искать в названии или описании или по электронной почте или article_title столбец, содержащий то, что когда-либо была представлена ​​в текстовом поле поиска

Вот пример из рыться под капотом

>> User.ransack(first_name_cont: 'Rya').result.to_sql 
=> SELECT "users".* FROM "users" WHERE ("users"."first_name" LIKE '%Rya%') 

Его простой в использовании и может быть использовано для расширенного поиска, если требуется

+0

Ну, это не совсем запросы свободной формы :) –

+0

Ваш пример объединяет имя, описание, email и article_title с помощью инструкций OR. Что делать, если мне нужно учитывать любую комбинацию этих операторов с любой смесью операторов AND, OR и NOT, ни одна из которых не указана до выполнения? Я просмотрел Ransack немного, но все еще не вижу никакого простого способа сделать это. – ineedahero

0

Во-первых, Никогда положить пользовательский ввод непосредственно в SQL запросе. (Надеюсь, вы не или использовать sanitize)

Во-вторых, я не уверен, но, возможно, вам действительно не нужно расширенный поиск но расширенный фильтр. Заставить пользователя писать сложные запросы - не очень хорошая идея. В этом случае вы, вероятно, захотите добавить отдельный ввод для каждого оператора. Возможно, это не соответствует вашим требованиям, но ... просто подумайте об этом.

В-третьих, в случае, если нужно действительно передовые поиск Я предлагаю вам не поставить эту задачу на вашей базе данных. Даже если у вас есть правильные индексы, сложные запросы на больших таблицах (например, 10 000 строк) будут работать очень медленно. И это не только делает ваше приложение непривлекательным, но и уязвимым для дешевых (даже бесплатных) DDoS-атак.

Для этого вы должны использовать инструменты, которые для него созданы. Elasticserach - тот, который я предпочитаю. У него отличные драгоценные камни (Base, Rails integraion), которые снимают много грязной работы. Тем не менее, это не так просто (особенно в первый раз), чтобы получить его на работе, но преимущества, которые вы заслуживаете.

Если это слишком сложно..хорошо, чем Ransack - тот, который вам нужен.

P.S. Не стесняйтесь поправлять меня, если я что-то испортил.

+0

Ну, я получил обратную связь, где они попросили меня сделать такие вещи, как «найти пользователя, которому 27 лет, но это не Джон Картер». Поэтому я не знаю, как быть в состоянии справиться с этим, кроме того, как я изложил его выше. Думаю, я продолжу смотреть на Ransack – ineedahero

Смежные вопросы