2011-12-10 18 views
0

查找方法对于检索记录非常方便,而且我经常使用:include来预取引用的记录以避免昂贵的数据库访问。对散列数组执行查找以避免数据库查找

我有一个情况,我检索销售人员的所有销售。

@sales = Sales.find(:all, 
        :include => [:salesperson, :customer, :batch, :product], 
        :conditions => {:salesperson_id => someone}, 
        :order => :customer_id) 

然后我想根据返回的内容对返回的记录进行切片和切块。例如,我想为此销售人员在特定商店所做的所有销售生成报告,我们知道这是以前返回的数据的子集。

我希望做的是,

@storeSales = @sales.find_by_store(store_id) 

...和检索作为一个新的数组保存在内存中的数组这个子集,而不是在执行查找实现同样的事情数据库再次。毕竟,@sales只是一个Sales对象的数组,所以这应该被支持似乎不合理。

但是,似乎没有一种方便的方法可以做到这一点,是吗?谢谢。

+0

'@ sales.inspect'show是什么? – maprihoda

+0

这里没有散列数组。 –

+0

啊,我的坏,谢谢大卫。 – Snips

回答

4

如果您使用的是Rails 3,则@sales将是一个AREL标准对象。您可以执行的操作如下:

@sales = Sales.find(:all, 
        :include => [:salesperson, :customer, :batch, :product], 
        :conditions => {:salesperson_id => someone}, 
        :order => :customer_id)**.all** 

现在@sales是销售模型对象数组的一个实例。获取数组对象的子集使用选择的方法是现在很容易:

@my_product_sales = @sales.select { |s| s.product == my_product_criteria } 

在使用select method你现在有@sales是整个结果集,并@my_product_sales基础上,收集标准是该子集。

+0

非常感谢! – Snips

+0

这是一个非常昂贵的方法。这与Arel无关。 – Trip