You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby/Rails按属性分组筛选同时包含两个不同属性值分组的查询方法

正确实现方案

核心错误说明

你原有写法的逻辑错误在于,having里的topping = ? AND topping = ?要求单条记录的topping字段同时等于两个不同值,这在逻辑上不可能,因此永远返回空结果。

实现逻辑

你需要先筛选出同时拥有jelly和peanut butter两种topping的user_id,再查询这些user_id对应的所有Sandwich记录,最后按user_id分组即可。

通用全数据库兼容写法

# 第一步:筛选符合条件的user_id
qualified_user_ids = Sandwich.group(:user_id)
  .having(
    "SUM(CASE WHEN topping = ? THEN 1 ELSE 0 END) >= 1 AND SUM(CASE WHEN topping = ? THEN 1 ELSE 0 END) >= 1",
    "jelly",
    "peanut butter"
  )
  .pluck(:user_id)

# 第二步:查询对应所有记录并按user_id分组
result = Sandwich.where(user_id: qualified_user_ids).group_by(&:user_id).values

PostgreSQL 简化写法

如果使用PostgreSQL作为数据库,可以大幅简化having判断逻辑:

# 子查询一步完成筛选
result = Sandwich.where(
  user_id: Sandwich.select(:user_id)
            .where(topping: ["jelly", "peanut butter"])
            .group(:user_id)
            .having("COUNT(DISTINCT topping) = 2")
).group_by(&:user_id).values

返回结果说明

最终得到的result结构和你要求的示例完全匹配,每个子数组对应一个user_id的所有Sandwich记录。

内容的提问来源于stack exchange,提问作者Trip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:57:02