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)
如果您愿意放弃对 作用域的重用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)
| 归档时间: |
|
| 查看次数: |
3142 次 |
| 最近记录: |