我想使用对 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
这是导致错误的相关代码,我想对一组分组数据执行一些计算,但在完成第一次计算后,我一直得到 p>
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"
)
这将返回一组记录,每个记录都有方法 day
、sum_price
、max_price
、min_price
和 avg_price
。
请注意,SQL 函数的名称可能因您的数据库而异
关于ruby-on-rails - 在同一个查询对象中运行多个 AR 操作(min、max、avg..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55840676/