Запрос на две модели HABTM (Rails3) - PullRequest
0 голосов
/ 19 июля 2011

У меня есть две модели: клиенты и товары с ассоциацией HABTM. Я хотел бы найти самый быстрый способ выбрать всех клиентов, у которых есть несколько (более одного) элементов (или определенное количество элементов).

class Client < ActiveRecord::Base
  has_and_belongs_to_many :items
end

class Item < ActiveRecord::Base
  has_and_belongs_to_many :clients
end

В приведенном ниже запросе выбираются клиенты, у которых есть ОДИН элемент из списка:

required_item_ids = Item.where(:kind => :book).collect(&:id)
Client.join(:items).where(:items => {:id => required_item_ids})

Но необходим список клиентов, имеющих НЕСКОЛЬКО или ВСЕ требуемые позиции.

Я считаю, что это простой вопрос, так как я новичок в Rails, но я просмотрел все подобные вопросы здесь и в некоторых других местах и ​​не нашел ответа.

1 Ответ

1 голос
/ 19 июля 2011

Если это одноразовое задание, вы можете получить этот список, просматривая все клиенты в Ruby.Что-то вроде:

clients_with_more_than_one_book_items = []
book_items = Item.where(:kind => :book)

Client.find_each do |client|
  books_count = 0
  client.items.each do |item|
     if book_items.include?(item)
        books_count += 1
     end
  end

  clients_with_more_than_one_book_items << client if books_count > 1
end

Однако это может занять некоторое время, если у вас много клиентов и элементов, поэтому, если это часто выполняемый запрос, возможно, стоит добавитьbooks_count атрибут для модели клиента и для добавления кода (в пределах обратных вызовов в модели), который сохраняет его обновленным как своего рода кеш счетчика.

...