В приложении rails 4 в одной модели у меня есть столбец, содержащий несколько идентификаторов в виде строки с значениями, разделенными запятой.Запрос в столбце строки для одного из значений в массиве, таком как несколько OR (с использованием полнотекстового поиска)
"123,4568,12"
У меня есть «поиск» двигатель, который я использую для извлечения записей с помощью одной или нескольких значений с помощью полнотекстового поиска PostgreSQL я могу сделать что-то вроде этого, что очень полезно:
records = MyModel.where("my_models.col_name @@ ?", ["12","234"])
Это возвращает все записи, которые имеют как 12, так и 234 в целевом столбце. Массив поступает из формы с множественным выбором.
Теперь я пытаюсь сделать запрос, который найдет все записи, в которых есть 12 или 234 строки.
я прыгал, чтобы быть в состоянии сделать что-то вроде:
records = MyModel.where("my_models.col_name IN (?)", ["12","234"])
Но это не работает.
Должен ли я перебирать все значения в массиве для построения запроса с несколькими OR? Есть ли что-то более подходящее для этого?
EDIT/TL; DR
@BoraMa ответ является хорошим способом для достижения этой цели.
Чтобы найти все записи, содержащие один или несколько идентификаторов, на которые ссылаются в использовании запроса:
records = MyModel.where("my_models.col_name @@ to_tsquery(?)", ["12","234"].join('|'))
Вам нужно to_tsquery и объединение с одной трубой |
сделать OR
как запрос (?).
Чтобы найти все записи, содержащие точно все идентификаторы в использовании запроса:
records = MyModel.where("my_models.col_name @@ ?", ["12","234"])
И, конечно, заменить [ "12", "234"] с чем-то вроде params[:params_from_my_form]
Postgres documentation for full text search
Можете вы изменить схему так, чтобы вы не хранили CSV в столбце? Возможно, вместо этого используйте столбец массива PostgreSQL. –
Я просто вижу ваш комментарий. На самом деле я не могу изменить схему, но это хорошая идея для будущего. На данный момент я продолжу использовать преимущество полнотекстового поиска. См. Мое обновление для решения. –