Ruby on rails 在同一查询对象上跟踪多个AR操作(最小、最大、平均…)

Ruby on rails 在同一查询对象上跟踪多个AR操作(最小、最大、平均…),ruby-on-rails,ruby,Ruby On Rails,Ruby,我想使用一个查询来执行多个计算,以对历史记录表进行定价,并最终使用这些价格(如平均值、最小值和最大值等)呈现一些统计数据 price_histories_controller.rb 这是导致错误的相关代码,我想对一组分组数据执行一些计算,但在第一次计算完成后,我继续得到 TypeError没有将符号隐式转换为整数 理想情况下,我最终会得到这样一个要渲染的对象: @all_stats = { average: avg_array, min: min_array, max: max_ar

我想使用一个查询来执行多个计算,以对历史记录表进行定价,并最终使用这些价格(如平均值、最小值和最大值等)呈现一些统计数据

price_histories_controller.rb

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

TypeError没有将符号隐式转换为整数

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

@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调用“select”时,至少有一个字段:


我认为这应该奏效:

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"
)
这将返回一个记录数组,每个记录都有方法day、sum_price、max_price、min_price和avg_price


请注意,SQL函数的名称可能会根据您的db而有所不同,

尝试了您的解决方案,并且->错误:列price_histories.day必须出现在GROUP BY子句中,或者在聚合函数中使用。如果我删除day,我很抱歉,我指的是group:day。你能用Arel使这个数据库独立吗?@br3nt希望它能做到,但我不知道怎么做。不过我很想知道,你说得对raise@br3nt我试着浏览了一个方法的源代码,比如,它看起来最终会进入,为单个操作生成一个完整的SELECT语句。但是,我不知道Arel和ActiveRecord有什么不同,所以可能吧?
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"
)