【问题标题】:Re sorting active records in rails without re querying the database?在不重新查询数据库的情况下重新排序 Rails 中的活动记录?
【发布时间】:2014-03-29 18:33:25
【问题描述】:

例如,假设我有一个名为 Products 的模型,并且在 Products 控制器中,我有以下代码用于 product_list 视图以显示已排序的产品。

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

让我们想象一下,在 product_list 视图中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常变化。

我很难理解的是,rails 是否必须在每次用户选择新的 order_by 过滤器时进行查询,或者 rails 是否能够以某种方式缓存活动记录以便在服务器端重新排序?有没有办法编写它,这样如果用户排序,rails 就不会重新查询结果? (即如果产品表不经常更改,那么如果用户只想按不同的变量进行排序,那么进行查询是没有意义的)

谢谢,

【问题讨论】:

  • 您如何/在哪里缓存 ActiveRecord 对象?如果对象只是在实例变量中,则它们不会在请求之间保留在内存中。它们是否存储在 memcache 或类似的东西中?如果您不想运行另一个查询来检索对象,您可以在客户端进行排序(在 javascript 中)。
  • 要添加到@Coenwulf,我发现 jquery 的 DataTables 插件在显示对象列表时很有帮助。它内置了排序功能。 link
  • 离题:不要这样做Product.order(params[:order_by]) 这是 activerecord 不会清理用户输入的区域之一 - 它对 sql 注入攻击是开放的,阅读此stackoverflow.com/questions/7771103/… 了解更多信息跨度>
  • @Coenwulf 我没有在客户端缓存对象。我想知道 Rails 是否在服务器端进行任何幕后缓存。我猜你是说用不同的 order_by 参数刷新视图总是会产生一个完整的新查询,而 rails 没有做任何优化?
  • @house9 谢谢,我实际上使用的是 railscast 方法。上面的代码只是为了保持简单

标签: ruby-on-rails ruby sorting caching activerecord


【解决方案1】:

您可能正在寻找 sort_by 方法。它将允许您在服务器端对集合进行排序,而无需使用任何活动记录查询。

这段代码结果:

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

应该和

一样
@products = Product.order(:name) # SQL sorting

【讨论】:

  • 在 [大约] 多少点/大小,这样做比简单地使用活动记录的排序方法要慢?
  • 我想说,如果你能做一个 SQL 排序,就去做吧,它应该总是更快。
  • 有趣...我的印象是,如果您可以避免重新查询数据库,那么您应该这样做。因此,如果我执行Product.where("name LIKE ?", "n%"),则需要额外的查询才能执行.order(:created_at)。这是一个错误的假设吗?这难道不是上述问题的重点吗?
  • 这实际上取决于您是否使用第一个查询的结果。如果您编写 a = Product.where(...) 然后执行类似 a.each 的操作,那么您可以考虑在 ruby​​ 中进行排序。但是,如果您从未以需要访问数据的方式使用结果 a,那么请求就不会完成。只有当应用程序需要访问它时才会这样做
  • 最快的方法是第三种:@company.products.where('importance > 0 AND importance < 2001)
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 2018-07-06
  • 2011-08-03
  • 2014-12-21
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多