Rails关联查询时如何在where子句实现CPT编码数组的AND全匹配
Rails关联查询匹配全部关联值方案
你原来的查询仅能匹配code_array中任意一个CPT编码,要实现匹配全部编码的需求,可通过分组+计数校验的方式改写:
改写后查询代码
# 先对目标编码去重,避免数组重复值导致计数逻辑错误 target_codes = code_array.uniq Policy.joins(policy_coverages: :cpt_code) .where(cpt_codes: { code: target_codes }) .group('policies.id') .having('COUNT(DISTINCT cpt_codes.code) = ?', target_codes.length)
逻辑说明
- 第一步和原查询逻辑一致,先过滤出所有关联了
target_codes范围内任意CPT编码的Policy记录 - 按Policy主键分组,将同一Policy的所有匹配关联记录聚合
- 通过
having条件校验:聚合分组内去重后的CPT编码数量,和目标编码数组的长度完全相等,即可证明该Policy关联了所有需要的CPT编码
注意事项
- 如果Policy表主键使用非
id的自定义字段,需要同步修改group方法内的字段名 - 若业务中存在软删除逻辑,需要在
where条件中补充过滤已删除的关联记录(如policy_coverages、cpt_codes的软删除标记过滤) - 该方案兼容PostgreSQL、MySQL等主流关系型数据库,且适配长度不固定的动态
code_array场景,无需手动拼接多条件查询
内容的提问来源于stack exchange,提问作者Usman
相关产品推荐
相关产品推荐

