首页 > 解决方案 > 获取与特定id没有关系的记录

问题描述

我有名为OrderPrinter的模型。

一个订单可以由多台打印机打印,但特定的打印机可以打印一次。

我有另一个模型OrderPrinter,它记录了哪些打印机打印了它。

因此,每当打印机说 PrinterA 发送请求时,我必须找到该 PrinterA 尚未打印的订单并将其返回。

我正在努力实现它

Order.left_outer_joins(:order_printers)
.where("order_printers.printer_id IS NULL OR order_printers.printer_id != ?", printer.id)
.order(:id).distinct.limit(1)

IS NULL检查是否不存在任何关系,这很好

order_printers.printer_id != ?",printer.id试图查找它是否从未打印过 PrinterA。

我知道它有问题,就好像它已经由 PrinterA 打印并且之前使用其他打印机打印,比如 PrinterB,但此检查失败并且它返回记录,尽管它已经由 PrinterA 打印。

我该如何处理?

标签: ruby-on-railspostgresql

解决方案


你可以做一个子查询:

Order.where.not(
   id: printer.orders
)

这将创建以下查询:

SELECT "orders".* FROM "orders" 
WHERE "orders"."id" 
NOT IN (
  SELECT "orders"."id" FROM "orders" 
  INNER JOIN "order_printers" 
  ON "orders"."id" = "order_printers"."order_id" 
  WHERE "order_printers"."printer_id" = ?
) LIMIT ? 

这假设您的模型中有一个间接关联设置:

class Printer < ApplicationRecord
  has_many :order_printers
  has_many :orders, through: :order_printers
end

推荐阅读