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