【问题标题】:How to group and count the last N results?如何对最后 N 个结果进行分组和计数?
【发布时间】:2017-02-20 19:01:32
【问题描述】:

在 Rails 中,您可以使用:

Model.group(:field).count

产生类似的东西:

{"a"=>7, "b"=>5, "c"=>3 "d"=>3, "e"=>4}

但是我如何计数只在最后 N 行,而不是整个表中,DATABASE 进行计算? p>

不工作:

Model.limit(100).group(:field).count

limit 将限制哈希输出键而不是使用的表行

Model.last(100).group(:field).count

Last 返回一个数组并引发错误

我正在使用: * 红宝石 2.3.3p222 * 导轨 4.2.4 * 第 9.5.6 页

【问题讨论】:

  • 这应该可以工作:Model.where(id: Model.limit(100).select(:id)).group(:field).count
  • @AbM 我只能说:爆头!请使用“答案”我可以接受吗?

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 rails-postgresql


【解决方案1】:

正如您所提到的,limit 应用于分组实例,而不是实例本身。一个简单的解决方法是:

Model.where(id: Model.limit(100).select(:id)).group(:field).count

【讨论】:

  • 我们忘记了 order 以获得最后的结果: > Vote.where(id: Vote.limit(100).select(:id).order(created_at: : desc)).group(:emotion).count
【解决方案2】:

数组对象也可以使用group_by进行分组:

grouped = Model.last(100).group_by(&:field).map { |k,v| [k, v.length] }

这将返回以下矩阵:

#=> [["Field value 1", value_1_count], ["Field value 2", value_2_count], etc...]

矩阵也可以变成哈希:

grouped.each_with_object({}) { |value, memo| memo[value[0]] = value[1] }

总结一下,试试以下方法:

Model.last(100)
  .group_by(&:field)
  .each_with_object({}) { |(key, value), memo| memo[key] = value.length }

【讨论】:

  • 您发布了一个非常好的答案,公平地说,我必须接受它。但是我会更新这个问题,因为我错误地忽略了一个非常重要的信息:不是在数组中,而是在 SQL 中(所以 basebase 将进行计算。> Model.group(:field).count 使用数据库进行计算,而不是一个数组(红宝石)计算。我可以有这个吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2015-06-23
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多