我已经为我的网站的搜索功能实现了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%')
这个查询在我看来很正确,尤其是它与只输入一个术语时生成的查询大致相同,这很好。
当在字段中输入多个术语时,有人能说明我可能需要更改什么才能使搜索正常工作吗?
欢迎使用堆栈溢出👋.
该查询不适用于多个流派,因为它只从genres
表中选择一个流派的name
同时包含"摇滚">和"蓝调"的行,因此它只匹配"摇滚/蓝调"或"布鲁斯摇滚民谣"等流派。
听起来你想要的是WHERE ("genres"."name" ILIKE '%rock%' OR "genres"."name" ILIKE '%blues%')
,其中OR
意味着它将匹配任何一种,所以"摇滚"one_answers"蓝调"流派都将匹配。
就在Ransack中实现这一点而言,GitHub项目上的这条评论看起来与您的类似,但在您设置分组之前包括以下行:
params[:q][:combinator] = 'or'
我还没有在本地测试过这一点,但添加这一行会将组组合从AND
转换为OR
,这应该会得到正确的搜索结果。
请告诉我进展如何,如果有效,我会删除暂定的"应该"one_answers"出现"😉.