मैं अपने रेल आवेदन पर एक लंबी क्वेरी लिख रहा हूं, इसका एक हिस्सा (अंतिम .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" = $1 AND "products"."id" = $2 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 है, यह फ़िल्टर कैसे पास कर रहा है?

0
Omar Hussein 11 नवम्बर 2020, 11:37

1 उत्तर

सबसे बढ़िया उत्तर

यह फ़िल्टर पास कर रहा है क्योंकि इन्वेंट्री में दो आइटम हैं। वर्तमान फ़िल्टर केवल तभी मामलों को फ़िल्टर करता है जब

  1. इन्वेंट्री में कोई आइटम नहीं हैं, या
  2. इन्वेंट्री में 0 की मात्रा के साथ एक आइटम है।

जब इन्वेंट्री में दो या दो से अधिक आइटम होते हैं, तो वह इसे फ़िल्टर नहीं करेगा।

यदि आपको सभी मात्राएं 0 होने पर मामलों को फ़िल्टर करने की आवश्यकता है, तो आपको फ़िल्टर की अंतिम पंक्ति को बदलने की आवश्यकता है

.where.not("ARRAY(select distinct (jsonb_each(inventory)).value->>'quantity' as integer)='{0}'")
0
DNNX 11 नवम्बर 2020, 10:08