2012-03-12 26 views
5

Chào bạn,Rails 3 - mệnh đề where trên has_many thông qua hiệp hội

Tôi có một vấn đề nhỏ với một truy vấn nơi trên has_many: thông qua hiệp hội ...

thiết lập của tôi là như sau:

PurchaseOrderAddressAssignment:

belongs_to :address 

belongs_to :purchase_order 

Địa chỉ:

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 

My mệnh đề where:

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

là trở về 0 ghi ... nhưng không nên có ít nhất 1. ..

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

là trở về [168, 169, 170, 327]

... Tôi nghĩ rằng tôi quá ngu ngốc để giải quyết vấn đề này chút: -/

Ai đó có thể cho tôi biết những gì tôi làm sai ở đây?

Thx,

Michael

+0

Hãy thử thay đổi 'PurchaseOrder.where (" addresses.id = 168 và addresses.id = 169 ") này bao gồm (: địa chỉ)' thành 'PurchaseOrder.where (addresses.id => [168,169]). : địa chỉ) 'và xem điều gì xảy ra. – ScottJShea

+0

thx cho câu trả lời của bạn. Tôi quên nói rằng tôi đã thử mệnh đề where với IN (...). Vấn đề ở đây là nếu tôi đang sử dụng ở đâu ("addresses.id IN (n1, n2, n3)") truy vấn sẽ trả về 1000 PurchaseOrders ... Trong trường hợp của tôi chỉ có 1 PurchaseOrder với address_ids = [168, 169, 327] – sufu90

+0

'addresses.id => [168,169]' chỉ giới hạn ở hai giá trị đó. – ScottJShea

Trả lời

9

tôi có lẽ sẽ làm một công cụ tìm tùy chỉnh trong trường hợp này.

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 

Tôi chắc chắn rằng nó sẽ hoạt động.

Đây là số similar answer giúp giải thích truy vấn.

+0

Thx Azolo, đây chính là điều tôi đang tìm kiếm! – sufu90

3

Vì vậy, bạn muốn PurchaseOrder 's nơi addresses nằm trong danh sách của một số id

Hãy thử điều này:

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

Vấn đề với điều này là nó sẽ ALL 'PurchaseOrder's có 168 hoặc 169, thay vì chỉ là 'PurchaseOrder' chỉ chứa những địa chỉ đó. – Azolo

Các vấn đề liên quan