同一字段中的多项Ransack搜索不起作用

时间:2018-12-06 13:11:54

标签: ruby-on-rails ruby ruby-on-rails-5 ransack

我已经为网站的搜索功能实现了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 :(得分:0)

欢迎堆栈溢出。

该查询不适用于多种流派,因为它仅从genres表中选择行,其中name的流派既包含“ rock”,又包含“ blues” ”,因此它只能匹配“ rock / blues”或“ bluesy rock ballads”之类的流派。

听起来像您追随的是WHERE ("genres"."name" ILIKE '%rock%' OR "genres"."name" ILIKE '%blues%'),其中OR表示它将匹配,所以“ rock”和“ blues”流派都将匹配。

就让它在Ransack中工作而言,GitHub项目上的this comment看上去与您的相似,但是在设置分组之前包括以下行:

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

我尚未在本地进行测试,但是似乎显示,添加该行会将分组组合从AND转换为OR应该为您提供正确的搜索结果。

让我知道如何进行,如果可行,我将删除暂定的“应该”和“出现”。