Точное совпадение Ransack со значениями массива
Я должен выполнить поиск в базе данных с помощью ransack. Несколько столбцов в базе данных имеют данные, хранящиеся в сериализованных массивах. Я хочу сопоставить точные данные, хранящиеся в массивах, с данными, отправленными пользователем для выполнения поиска (данные пользователей также являются массивами). Например, в базе данных один столбец имеет данные как (c1
, c2
- тестовые примеры):
c1.column_data = [1, 2, 3, 4, 5]
c2.column_data = []
Пользователь ищет данные (t1
, t2
, t3
- это тестовые примеры):
t1.user_data = [1]
t2.user_data = [1, 3]
t3.user_data = [1, 2, 3, 4, 5]
t4.user_data = []
- Для случая
c1
с t1
, t2
, t4
он не должен возвращать no match found
. - С
t3
это должно получиться с match found
. - Для случая
c2
с t1
, t2
, t3
он не должен возвращать no match found
. - С
t4
он возвращает результат.
Я нашел postgres_ext gem, но я не могу заставить его работать. Может ли кто-нибудь предложить, как я могу это сделать или предложить какой-либо альтернативный метод для поиска? Любое альтернативное решение также приветствуется.
Ответы
Ответ 1
Я отвечаю на свой вопрос.
Он может отличаться от требования.
Мне пришлось взять параметры пользователя и выполнить поиск в базе данных, если какие-то точные данные совпадают, а затем поместить пользователя в ту же группу, что и новая группа с найденными данными, а в конце также сохранить все найденные данные для соответствующего пользователя.
Поскольку во всех полях были отмечены флажки выбора нескольких выпадающих списков и т.д., Все параметры были в виде массива строк.
Мое обходное решение проблемы: 1. отсортировал параметры массива и соединил его с запятой и создал строку. например:
a = [1,2,3,4,5,6]
a.sort.join(',')
"1,2,3,4,5,6"
Я сохранил эту строку в столбце базы данных, который находится в тексте. Нет, когда пользователь ищет группу, я беру ее параметры и преобразовываю ее снова в строку, разделенную запятыми, и используя запрос предложения предложения к базе данных.
В UI я снова преобразую эту строку в массив и покажу ее пользователю.
Я не знаю, как правильно это сделать или нет, но он работает для меня.
все же любые хорошие решения приветствуются.
Ответ 2
ok, с рельсами 5.1 простой поиск Ransack будет работать нормально. Например, если предположить, что один из ваших столбцов с сериализованным именем массива - 'column_data'
t.text :column_data, array: true, default: []
вы можете искать столбцы массива, следуя этому синтаксису:
‘{ val1, val2, … }
например, в консоли
some_search = Model.search(column_data_eq: '{1,3}')
some_search.result
должен дать вам следующие результаты
SELECT "model".* FROM "mdole" WHERE "model"."column_data" = '{1,3}' LIMIT $1 [["LIMIT", 11]]