2012-03-12 3 views
5

Привет там,Rails 3 - где пункт о has_many через ассоциацию

У меня есть небольшая проблема с где запросом на 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

Попытайтесь изменить это 'PurchaseOrder.where (" addresses.id = 168 и addresses.id = 169 ") .Она включает (: адреса)' в 'PurchaseOrder.where (addresses.id => [168,169]). : адреса) 'и посмотреть, что произойдет. – ScottJShea

+0

thx для вашего ответа. Я забыл сказать, что я уже пробовал предложение where с IN (...). Проблема в том, что если я использую where ("addresses.id IN (n1, n2, n3)"), запрос вернет около 1000 BuyOrders ... В моем сценарии есть только 1 PurchaseOrder с address_ids = [168, 169, 327] – sufu90

+0

'addresses.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 «S, где addresses находятся в списке некоторых идентификаторов

Попробуйте это:

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

. Проблема в том, что он будет ВСЕ 'BuyOrder' которые имеют 168 или 169, а не только «PurchaseOrder», который содержит только эти адреса. – Azolo

Смежные вопросы