Многократный поиск Ransack в том же поле не работает - PullRequest
0 голосов
/ 06 декабря 2018

Я реализовал Ransack для функции поиска моего сайта и хочу иметь возможность поиска в одном столбце базы данных по нескольким терминам, введенным в одном и том же поле ввода.

Вот код в моем контроллере:

if params[:q]
    params[:q][:groupings] = []
    split_genres = params[:q][:genres_name_cont].split(' ')
    params[:q][:genres_name_cont].clear
    split_genres.each_with_index do |word, index|
      params[:q][:groupings][index] = {genres_name_cont: word}
    end
end

@q = Band.ransack(params[:q])
@bands = @q.result(distinct: true).includes(:genres).sort_by{|band| band.name}

А вот запрос, который возвращается, когда я ввожу в поиск несколько жанров:

SELECT "bands".* FROM "bands" LEFT OUTER JOIN "bands_genres"
ON "bands_genres"."band_id" = "bands"."id" LEFT OUTER JOIN "genres"
ON "genres"."id" = "bands_genres"."genre_id"
WHERE ("genres"."name" ILIKE '%rock%' AND "genres"."name" ILIKE '%blues%')

Запрос выглядит мне правильно, особенно с учетом того, что он более или менее идентичен запросугенерируется, когда вводится только один термин, который работает нормально.

Может ли кто-нибудь пролить свет на то, что мне может понадобиться изменить, чтобы этот поиск работал, когда в поле введено несколько терминов?

1 Ответ

0 голосов
/ 07 декабря 2018

Добро пожаловать в Stack Overflow ?.

Запрос не работает для нескольких жанров, потому что он выбирает только строки из таблицы genres, где name жанра содержит оба "рок" и"блюз", поэтому он будет соответствовать только жанрам, таким как "рок / блюз" или "блюзовые рок-баллады".

Звучит так, как вы хотите, это WHERE ("genres"."name" ILIKE '%rock%' OR "genres"."name" ILIKE '%blues%'), где OR означает, что он будет совпадать, так что жанры "рок" и "блюз" будут совпадать.

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

params[:q][:combinator] = 'or'

Я не проверял это локально, но появляется , что добавление этой строки преобразует группукомбинация от AND до OR, которая должна дать вам правильные результаты поиска.

Дайте мне знать, как это происходит, и я уберу пробные "следует" и "появляется"«Если это работает ?.

...