2012-03-12 10 views
5

नमस्कार के माध्यम से has_many पर खंड,रेल 3 - जहां संघ

मैं एक has_many पर एक जहां क्वेरी के साथ एक छोटे से समस्या है: संघ के माध्यम से ...

मेरे सेटअप इस प्रकार है:

PurchaseOrderAddressAssignment:

belongs_to :address 

belongs_to :purchase_order 

पता:

has_many :purchase_order_address_assignments 

has_many :purchase_orders, :through => :purchase_order_address_assignments 

PurchaseOrder:

has_many :purchase_order_address_assignments 

has_many :addresses, :through => :purchase_order_address_assignments 

मेरे जहां खंड:

PurchaseOrder.where("addresses.id = 168 and addresses.id = 169").includes(:addresses) 

लौटने 0 रिकॉर्ड्स ... लेकिन कम से कम 1 होना चाहिए। ..

PurchaseOrder.where(:baan_id => "KD0005756").first.address_ids 

है लौटने [168, 169, 170, 327]

... मुझे लगता है कि मैं भी इस छोटे से समस्या को हल करने मूर्ख हूँ: -/

कोई मुझे बता सकते हैं कि मैं क्या कर रहा हूँ यहाँ गलत कर रहे हो?

Thx,

माइकल

+0

इस 'खरीद ऑर्डर.एवर ("address.id = 168 और address.id = 169") को बदलने का प्रयास करें। (: पते) '' खरीददारी ऑर्डर.कॉयर (address.id => [168,169]) में शामिल है (: पते) 'और देखें कि क्या होता है। आपकी प्रतिक्रिया के लिए – ScottJShea

+0

thx। मैं यह कहना भूल गया था कि मैंने पहले ही कोशिश की है कि आईएन (...) के साथ कहां है। यहां समस्या यह है कि यदि मैं कहां उपयोग कर रहा हूं ("address.id IN (n1, n2, n3)") क्वेरी 1000 खरीदार ऑर्डर लौटाएगी ... मेरे परिदृश्य में केवल 1 खरीद ऑर्डर है address_ids = [168, 16 9, 327] – sufu90

+0

'address.id => [168,169] 'केवल उन दोनों तक ही सीमित होना चाहिए। – ScottJShea

उत्तर

9

मैं शायद एक कस्टम खोजक करना होगा इस मामले में विधि।

class PurchaseOrder < ActiveRecordBase 
    def self.with_addresses(*args) 
    values = args.flatten.uniq 

    # Note use :joins instead of :includes if you don't 
    # want the addresses data 
    includes(:addresses) 
    where(:addresses => {:id => values}) 
    group("purchase_orders.id") 
    having("count(ad‌​dresses.id)=#{values.size}") 
    end 
end 

मैं बहुत यकीन है कि काम करना चाहिए हूँ।

यहां एक similar answer है जो क्वेरी को समझाने में मदद करता है।

+0

Thx Azolo, यह वही है जो मैं खोज रहा था! – sufu90

3

तो आप चाहते हैं PurchaseOrder की जहां addresses कुछ आईडी की सूची

में हैं इस प्रयास करें:

PurchaseOrder.where(addresses: {id: [168, 169]}).includes(:addresses) 
+0

का पुरस्कार दूंगा तो यह समस्या है कि यह 'खरीद ऑर्डर' जिसमें केवल 'खरीद ऑर्डर' की जगह 168 या 16 9 है, जिसमें केवल वे पते हैं। – Azolo