查询两个HABTM模型(Rails3)

时间:2011-07-19 07:39:03

标签: ruby-on-rails ruby-on-rails-3 activerecord associations has-and-belongs-to-many

我有两个模型,Clients和具有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})

但是需要的是具有SEVERAL或所有必需项目的客户列表。

我认为这是一个简单的问题,因为我是Rails的新手,但我在这里和其他一些地方查看了所有类似的问题,但没有找到答案。

1 个答案:

答案 0 :(得分:1)

如果这是一次性工作,那么您可以通过循环遍历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

但是,如果您拥有大量客户端和项目,则可能需要一段时间才能运行,因此如果这是您经常运行的查询,那么向{0}}添加books_count属性可能是个好主意。客户端模型,并添加代码(在模型的回调中),将其更新为一种计数器缓存。