Rails中使用includes查询关联表jsonb字段报FROM子句缺失错误如何解决
错误原因
当使用includes关联查询时,Rails不会自动将关联表加入当前查询的FROM子句,只有当查询条件满足特定触发规则时才会自动执行join操作,直接手写包含关联表名的SQL字符串条件时就会触发数据库找不到表的错误。另外你当前的写法还存在参数类型不匹配的问题,PostgreSQL的@> jsonb包含操作符要求右侧传入JSON格式字符串,直接传入Ruby哈希会导致语法错误。
解决方案
方案1:仅过滤订单,不需要返回关联order_items数据
使用joins方法显式关联order_items表,同时将查询条件的哈希转为JSON字符串:
Order.joins(:order_items) .where('order_items.metadata @> ?', { category: 'regular' }.to_json)
如果担心一个订单匹配多个订单项导致返回重复订单记录,可追加distinct去重:
Order.joins(:order_items) .where('order_items.metadata @> ?', { category: 'regular' }.to_json) .distinct
方案2:过滤的同时需要预加载order_items避免N+1查询
使用eager_load强制左连接关联表,同时预加载关联数据:
Order.eager_load(:order_items) .where('order_items.metadata @> ?', { category: 'regular' }.to_json)
方案3:更简洁的原生Rails写法(Rails 5+ 支持)
无需手写SQL字符串,直接用哈希嵌套写法,Rails会自动生成正确的jsonb包含查询语句:
Order.joins(:order_items) .where(order_items: { metadata: { category: 'regular' } }) .distinct
内容的提问来源于stack exchange,提问作者Gijs Verdonschot
相关产品推荐
相关产品推荐

