ruby-on-rails - 在同一个查询对象中运行多个 AR 操作(min、max、avg..)

标签 ruby-on-rails ruby

我想使用对 price_histories 表的一次查询执行多次计算,最后使用这些价格呈现一些统计数据,例如平均价格、最低价格和最高价格等。

price_histories_controller.rb

price_stats = PriceHistory.where('created_at >= ? AND cast(item_id as integer) = ?', 1.day.ago, params['item_id'])

avg_array = price_stats.group(:day).average(:price).to_a
min_array = price_stats.group(:day).min(:price).to_a
max_array = price_stats.group(:day).max(:price).to_a
count_array = price_stats.group(:day).count(:price).to_a

这是导致错误的相关代码,我想对一组分组数据执行一些计算,但在完成第一次计算后,我一直得到

TypeError (no implicit conversion of Symbol into Integer)

理想情况下,我最终会得到一个像这样的对象来渲染:

@all_stats = {
  average: avg_array,
  min: min_array,
  max: max_array,
  count: count_array
}

render json: @all_stats

这很好地总结了我的意图,我是 ruby​​ 的新手,我想要一个解决方案或更好的方法,我相信这是有的。

下面的代码工作正常,我希望任何人都能给我指出正确的方向,找出为什么它工作正常,以及在添加和额外计算时却没有:

    price_stats = PriceHistory.where('created_at >= ? AND cast(item_id as integer) = ?', 1.day.ago, params['item_id'])

    avg_array = price_stats.group(:day).average(:price).to_a

并导致:

{
  "average": [
      [
         null,
         "11666.666666666667"
      ],
      [
         "24/4/2019",
         "11666.666666666667"
      ],
      [
          "24",
          "11666.6666666666666667"
      ],
      [
          "2051",
          "11666.6666666666666667"
      ]
  ],
  "min": [],
  "max": [],
  "count": []
}

其他方法:

      PriceHistory.select(
        "AVG(price) AS average_score, 
        MIN(price) AS average_min, 
        MAX(price) AS average_max, 
        COUNT(*) AS price_count"
      ).where(
        'created_at >= ? AND cast(item_id as integer) = ?', 
        1.day.ago, params['item_id']
      ).group(:day)

错误:

ArgumentError (Call `select' with at least one field):

最佳答案

我认为这应该可行:

PriceHistory.where(
  'created_at >= ? AND cast(item_id as integer) = ?',
  1.day.ago,
  params['item_id']
).group(:day).select(
  "SUM(price) AS sum_price",
  "MAX(price) AS max_price",
  "MIN(price) AS min_price",
  "AVG(price) AS avg_price",
  "day"
)

这将返回一组记录,每个记录都有方法 daysum_pricemax_pricemin_priceavg_price

请注意,SQL 函数的名称可能因您的数据库而异

关于ruby-on-rails - 在同一个查询对象中运行多个 AR 操作(min、max、avg..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55840676/

相关文章:

ruby-on-rails - 如何以 json 形式返回 Doorkeeper 访问 token

ruby-on-rails - 使用 rspec 测试邮件程序 'from' header

ruby-on-rails - 如何向对象添加新属性?

ruby-on-rails - 如何使用 Ruby MongoDB 驱动程序将文档字段值作为 ISODate 插入?

ruby-on-rails - Neo4j.rb : as_json how to ignore root?

ruby-on-rails - 如何在 CSV 上传过程中防止 SQL 注入(inject)?

ruby - 有什么方法可以检测 Ruby 中的属性更改吗?

ruby-on-rails - 如何将 Searchkick gem 与acts_as_taggable gem 一起使用?

ruby - 修改 self ,Ruby

ruby-on-rails - 切换到 ruby​​ 项目目录时收到消息 'ruby-2.0.0-p647 is not installed'