同一领域的多术语 Ransack 搜索不起作用
Multi term Ransack search in same field not working
我已经为我网站的搜索功能实现了 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%')
我认为该查询正确,尤其是它与仅输入一个字词时生成的查询或多或少相同,效果很好。
当在字段中输入多个术语时,任何人都可以阐明我可能需要更改什么才能使此搜索正常工作吗?
欢迎来到 Stack Overflow。
该查询不适用于多个流派,因为它仅从 genres
table 中选取行,其中流派的 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
,应该 为您提供正确的搜索结果。
让我知道进展如何,如果可行,我将删除暂定的 "should" 和 "appears"。
我已经为我网站的搜索功能实现了 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%')
我认为该查询正确,尤其是它与仅输入一个字词时生成的查询或多或少相同,效果很好。
当在字段中输入多个术语时,任何人都可以阐明我可能需要更改什么才能使此搜索正常工作吗?
欢迎来到 Stack Overflow。
该查询不适用于多个流派,因为它仅从 genres
table 中选取行,其中流派的 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
,应该 为您提供正确的搜索结果。
让我知道进展如何,如果可行,我将删除暂定的 "should" 和 "appears"。