对哈希数组执行查找以避免数据库查找

时间:2011-12-10 17:03:09

标签: ruby-on-rails

find方法非常便于检索记录,我经常使用: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对象的数组,因此支持这一点并不合理。

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

1 个答案:

答案 0 :(得分:4)

如果您使用的是Rails 3,则@sales将成为AREL标准对象。你能做的是:

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

现在@sales是一个Sales of Model模型对象的实例。现在可以使用select方法轻松获取数组对象的子集:

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

使用select method后,您现在将@sales作为完整的结果集,并根据收集条件将@my_product_sales作为子集。