Postgresql查询根据jsonb child过滤掉属性

Postgresql query to filter out based on jsonb child property

我正在对我的 rails 应用程序编写一个长查询,其中一部分(最后一个 .where.not 是库存列的数量 属性 在其条目上不等于 0 ) 不管用。我当前的查询如下所示:

@products = @products.offset(offset).limit(@limit)
.where(status: "visible")
.where("add_to_inventory =? OR (add_to_inventory =? AND inventory !=? )", false, true, '{}')
.where.not("ARRAY(select (jsonb_each(inventory)).value->>'quantity' as integer)='{0}'")

但是,在我生成的产品数组中,产品 14 设法通过了此过滤,产品 14 看起来是这样。

2.4.6 :001 > Product.find(14)
  Product Load (0.8ms)  SELECT  "products".* FROM "products" WHERE "products"."deleted" =  AND "products"."id" =  LIMIT 1  [["deleted", "f"], ["id", 14]]
 => #<Product id: 14, deleted: false, category_id: 11, created_at: "2020-10-26 10:27:22", updated_at: "2020-11-10 16:26:11", final_price: 2342.0, status: 0, inventory: {"fsaf"=>{"sku"=>"", "barcode"=>"", "quantity"=>"0"}, "werwe"=>{"sku"=>"", "barcode"=>"", "quantity"=>"0"}}, add_to_inventory: true>

可以看到库存数量为0,这个是怎么过滤的?

它正在通过过滤器,因为库存中有两个项目。当前过滤器仅过滤掉

时的情况
  1. 库存中没有物品,或者
  2. 库存中有一件商品,数量为 0。

当库存中有两个或更多项目时,它不会将其过滤掉。

如果需要过滤掉所有数量为0的情况,需要将过滤器的最后一行改为

.where.not("ARRAY(select distinct (jsonb_each(inventory)).value->>'quantity' as integer)='{0}'")