【发布时间】: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