2014-02-26 28 views
4

例如,假设我有一个名为Products的模型,并在Products控制器中为product_list视图显示以下代码,以显示排序的产品。重新排序轨道中的活动记录而不重新查询数据库?

@products = Product.order(params[:order_by]) 

并让我们想象在product_list视图中,用户可以使用下拉列表按价格,评分,重量等进行排序。数据库中的产品不会频繁更改。

我很难理解的是,当用户选择一个新的order_by过滤器时,rails是否必须查询,或者rails会以某种方式缓存活动记录以便在服务器端进行重新排序?有没有办法写它,所以如果用户排序,rails将不会重新查询结果?

感谢,

+0

如何/你在哪里缓存ActiveRecord对象?如果对象仅在实例变量中,则这些对象不会在请求之间留在内存中。它们存储在memcache或类似的东西吗?如果你不想运行另一个查询来检索对象,你可以做排序客户端(在JavaScript中)。 – Coenwulf

+0

要添加到@Coenwulf,我发现DataTables插件可以让jquery在显示对象列表时很有用。它内置分类功能。 [链接](https://datatables.net) –

+0

关闭主题:不要这样做'Product.order(params [:order_by])'这是activerecord不会消毒用户输入的地方之一 - 它是开放的SQL注入攻击,阅读此http://stackoverflow.com/questions/7771103/rails-3-activerecord-order-what-is-the-proper-sql-injection-work-around的更多信息 – house9

回答

9

您可能正在寻找sort_by方法(即,如果因此在作出查询,如果用户只是想通过一个不同的变量排序是没有意义的产品表中不经常变化)。它将允许您对服务器端的集合进行排序,而不使用任何活动记录查询。

这段代码的结果:

@products = Product.all 
@products = @products.sort_by {|product| product.name} # Ruby Sorting 

应该是一样的

@products = Product.order(:name) # SQL sorting 
+0

在[大约]什么点/大小做这个比单纯使用活动记录的顺序方法慢? – michaelsking1993

+0

我会说,如果你可以做一个SQL排序,只要去做,它应该总是更快。 – Oxynum

+0

有趣...我的印象是,如果你可以避免重新查询数据库,你应该。因此,如果我执行'Product.where(“name LIKE?”,“n%”)',则需要额外的查询才能执行'.order(:created_at)'。这是一个错误的假设吗?这不就是上述问题的重点吗? – michaelsking1993