2012-08-23 117 views
0

用户的has_many项目 项目belongs_to的客户轨,Mongoid和复杂查询

使用mongoid(我不认为这是mongoid具体的,但无论如何)我需要给用户收集的所有客户端。目前我使用:

@clients = current_user.items.map{|c| c.client} 

但肯定它不好,不可接受。什么是实施的最佳方式?

+1

这并不可怕或什么。但是如果你通过一些伪代码来描述你希望你的最终语法是什么,那么这可能是最好的选择。基本上,这听起来像你想要将一些语法糖应用到你的代码,并有更清晰的代码,可能是这样的:clients = user.all_clients – RadBrad

+0

首先,因为结果是有一个数组,它不是很方便。其次,我不确定,但是我认为拥有大量的记录并不适合把它放在红宝石的肩膀上? (再次,它是mongodb) –

+0

明白了,我认为你有几个选择,要么手工制作一个你想要的SQL语句,要么使用ActiveRecord包含(Eager loading)。两者之间的决定可能是特定于应用程序的。 [链接](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html)查看关于Eager Loading – RadBrad

回答

2

为了不碰到N + 1问题,我会做这样的事情。

# first you retrieve all client ids 
ids = current_user.items.map(&:client_id) 

# then you retrieve all clients at once 
@clients = Client.in(id: ids)