如何在Rails控制台查询无关联Product的Purchase记录?
获取无关联对应Product的Purchase记录(Rails控制台)
我来给你几个在Rails控制台里能直接用的方案,都是日常处理这类遗留数据问题的常用方法:
使用Left Outer Join(Rails 5+推荐写法)
这是最直观的ActiveRecord写法,利用左外连接保留所有Purchase记录,再筛选出没有对应Product的条目:Purchase.left_outer_joins(:product).where(products: { id: nil })原理是
left_outer_joins会把每个Purchase和它关联的Product匹配,没有匹配到Product的记录里,products.id会是nil,通过这个条件就能精准筛选出目标记录。使用NOT EXISTS查询
另一种思路是找出所有不在「有关联Product的Purchase集合」里的记录,写法如下:Purchase.where.not(id: Purchase.joins(:product).select(:id))这里先通过
joins(:product)拿到所有有对应Product的Purchase ID,再用where.not排除这些ID,剩下的就是没有关联的Purchase。原生SQL查询
如果你更习惯写原生SQL,也可以直接执行下面的语句,逻辑和第一种方法一致:Purchase.find_by_sql("SELECT purchases.* FROM purchases LEFT JOIN products ON purchases.product_id = products.id WHERE products.id IS NULL")
注意事项
如果你的Rails版本低于5,left_outer_joins还没被引入,需要换成left_join:
Purchase.left_join(:product).where(products: { id: nil })
内容的提问来源于stack exchange,提问作者anonn023432
相关产品推荐
相关产品推荐

