ruby-on-rails - 获取与特定id没有关系的记录
问题描述
我有名为Order和Printer的模型。
一个订单可以由多台打印机打印,但特定的打印机可以打印一次。
我有另一个模型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 打印。
我该如何处理?
解决方案
你可以做一个子查询:
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
推荐阅读
- python - python端口扫描程序片段返回意外结果
- javascript - react firebase 不能打印子值?
- python - 将 Pandas 数据帧转换为 PyTorch 张量?
- c++ - 如何在 C++ 中生成一个从 0 到 N 的 size_t 包,其中 N 在编译时已知
- java - Java JTable 无法加载
- java - 如何(反)序列化棋盘游戏中改变游戏规则的卡片行为?
- sql - xQuery 函数返回值未显示
- angularjs - Bower 错误:无法加载资源:net::ERR_FILE_NOT_FOUND
- python - 在列表理解中使用具有多个参数的基于 len() 的条件的大多数 Pythonic 方式
- java - 带有最小 jar 的 Tomcat