Точное совпадение 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]]