Rails 3 - где пункт о has_many через ассоциацию - PullRequest
6 голосов
/ 12 марта 2012

Привет,

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

Закупка:

has_many :purchase_order_address_assignments

has_many :addresses, :through => :purchase_order_address_assignments

Предложение My where:

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]

... Я думаю, что я слишком глуп, чтобы решить эту маленькую проблему: - /

Может кто-нибудь сказать мне, что я делаюздесь не так?

Спасибо,

Майкл

Ответы [ 2 ]

10 голосов
/ 15 марта 2012

В этом случае я бы, вероятно, использовал собственный метод поиска.

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

Я почти уверен, что это должно сработать.

Вот аналогичный ответ , который помогает объяснить запрос.

3 голосов
/ 15 марта 2012

Итак, вы хотите, чтобы PurchaseOrder были addresses в списке некоторых идентификаторов

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

PurchaseOrder.where(addresses: {id: [168, 169]}).includes(:addresses)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...