我有两个模型,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的新手,但我在这里和其他一些地方查看了所有类似的问题,但没有找到答案。
答案 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
属性可能是个好主意。客户端模型,并添加代码(在模型的回调中),将其更新为一种计数器缓存。