如何修改Ransack自定义搜索器同时查询经理本人及其下属员工
解决方案
第一步:修改Employee模型中的自定义Ransacker
你只需要调整managers_ids ransacker的逻辑,将员工自身ID也纳入匹配范围即可,修改后的代码如下:
# /app/models/employee.rb ransacker :managers_ids, type: :string do # 拼接上级ID链和自身ID,统一用空格分隔 Arel.sql("CONCAT(COALESCE(REPLACE(employees.ancestry, '/', ' '), ''), ' ', employees.id)") end
代码逻辑说明
COALESCE(REPLACE(employees.ancestry, '/', ' '), ''):处理根节点员工ancestry为NULL的情况,避免拼接后整体值为NULL,同时保留原来把路径分隔符/替换为空格的逻辑- 末尾拼接
' ' + employees.id:将员工自身ID也加入到待匹配的字符串中,只要搜索的ID出现在上级链路,或者等于员工自身ID,都会被命中 - 把返回类型从
integer调整为string更符合字段实际存储格式,可避免类型转换异常
效果验证
修改后仍使用原有传参方式访问接口即可:/employees?q[managers_ids_special_in][]=1&q[managers_ids_special_in][]=2
现在返回结果会同时包含:
- id为1、2的经理本人
- 所有层级链路中包含1或2的下属员工
原有special_in谓词的逻辑不需要做任何修改。
内容的提问来源于stack exchange,提问作者GuidoMedina
相关产品推荐
相关产品推荐

