我有一个网上订购功能在我的应用程序,我想拉那些没有上周(我有一个字段:clients
跟踪此)内提交订单的所有: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
范围,并返回客户,其orders.within_last_week
是空的。
有没有办法做到这一点,而无需通过所有客户端循环?
下面是解决这个问题,通过在一个关系相结合的订单和客户,同时设置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")