【问题标题】:Rails Activerecord: Map vs pluck vs as_jsonRails Activerecord:Map vs pluck vs as_json
【发布时间】:2016-03-21 05:56:29
【问题描述】:

我的问题完全基于这 3 种方法对性能的影响。我需要知道哪种方法最适合手头的任务。

我需要为一组特定的记录呈现 json。

我目前使用的方法是

result = User.all.map{ |u| { name: u.name, id: u.id } }

您可能知道,这将遍历 Activerecord 对象,并且对于大量记录而言,这将具有非常低的性能。

另一种方法是使用 pluck。

result = User.all.pluck(:name,:id).map{ |u| { name: u[0], id: u[1] } }

性能可能要好得多,但代码看起来很臭。

如果我们将 as_json 覆盖为仅包含必要的参数,则使用 as_json 也可以实现相同的效果,但我需要知道这是否也会遍历 activerecord 对象。

如果有任何其他方法可以提供更好的性能,请随意说。

【问题讨论】:

  • 你能添加一个数据库后端吗?

标签: ruby-on-rails ruby activerecord


【解决方案1】:

你可以使用:

User.select(:id, :name).to_json

它的性能可能不如你的pluck(...).map 版本,这确实是非常低的级别。但它比您的 all.map 版本更快,更优雅(也更易于阅读)。

【讨论】:

  • pluck一样。
  • @Зелёный 不,不一样。 pluck 返回一个数组数组(因此您必须将它们映射为返回哈希值),但 select 返回一个 ActiveRecord 对象数组,其中只有 idname 已初始化。
  • 它执行相同的select ... sql 查询。我现在无法测试,但我很确定,具有整数和名称(如 [[2, "bob"], [3, "bill"]])的数组比具有 AR 对象(如 [#<User:0x005579aecdbe00 id: 2, name: "bob">, #<User:0x005579aecdb810 id: 3, name: "bill">])的数组使用的内存更少
  • 只是为了好玩here is a benchmark。采摘速度快 3 倍以上。
  • 所以我不明白为什么这种方法有更好的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 2023-03-04
  • 2018-02-11
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多