我的应用程序中具有在线订购功能,我想撤消所有在上周内未提交订单的:clients
(我有{{1 }}进行跟踪。
:submitted_at
我几乎希望能够使用此class Order < ApplicationRecord
belongs_to :client
scope :within_last_week, -> { where("submitted_at >= ?", 1.week.ago )}
end
class Client < ApplicationRecord
has_many :orders
end
范围并返回:within_last_week
为空的客户端。
有没有一种方法可以在不循环访问所有客户端的情况下?
答案 0 :(得分:0)
以下是解决此问题的一种方法,将订单和客户合并为一种关系,同时将客户关系设置为 left_outer_joins ,以使所有没有订单的客户也都获得:
Order.left_outer_joins(:client).select("clients.name, SUM(CASE WHEN submitted_at >= '12/01/2019' THEN 1 ELSE 0 END) as total_orders").having("total_orders = 0").group("clients.id")
另一种方式:
Order.left_outer_joins(:client).where("orders.submitted_at >= '12/01/2019' ").having("SUM(orders.id) = 0").group("clients.id")