基于 has_many 范围计数的 Rails 活动记录范围

mah*_*man 2 scope ruby-on-rails has-many ruby-on-rails-4

我有 Order 模型和一个 Container 模型,其范围如下:

class Order < ActiveRecord::Base
  has_many :containers, inverse_of: :order, dependent: :destroy
end

class Container < ActiveRecord::Base
  scope :full_pickup_ready, -> { where.not(full_pickup_ready_date: nil) }
end
Run Code Online (Sandbox Code Playgroud)

订单模型有一个字段调用quantity,它表示订单所需的容器数量,但不一定是容器关联的大小,因为并非所有容器数据都在创建订单时输入。

我想根据具有 full_pickup_ready_date 的容器的数量是否小于订单的数量字段来确定 Order 模型的范围。

我知道我可以在订单模型上使用合并来访问容器上的范围,如下所示:

def self.at_origin
  joins(:containers).merge(Container.full_pickup_ready).uniq
end
Run Code Online (Sandbox Code Playgroud)

但是如何将范围限制为具有 full_pickup_ready_date 的容器总数小于订单上的数量字段的订单?

更新:这相当接近,但我认为使用select效率不高:

includes(:containers).select {|o| o.containers.full_pickup_ready.size < o.quantity }
Run Code Online (Sandbox Code Playgroud)

gwc*_*des 5

如果您愿意放弃对 作用域的重用Container,那么您应该能够使用以下内容:

# scope on Order
joins(:containers)
  .group("orders.id")
  .having("count(CASE WHEN full_pickup_ready_date THEN 1 END) < orders.quantity")
Run Code Online (Sandbox Code Playgroud)