【发布时间】:2013-01-04 18:30:06
【问题描述】:
我有以下半高级数据库查询,它查看过去 10 年的每小时价格并返回过去 7 天的每日平均价格:
averages = Trade.where('date >= ?', 7.days.ago).average(:price, :group => "DATE_TRUNC('day', date - INTERVAL '1 hour')")
这会返回date(当天)和averageprice,如下所示:
"2012-12-29 00:00:00"=>#<BigDecimal:7f97932be328,'0.2513458333 33333333E2',27(27)>
然后我遍历每个响应并将它们保存为 TradeDailyAverage 模型中的新记录。
# Loops through each daily average produced above
averages.each do |date, avg|
# Converts the BigDecimal to Floating Point(?)
averagefloat = avg.to_f
# Rounds the Daily Average to only two decimal points
dailyaverage = number_with_precision(averagefloat, :precision => 2)
# Creates a new Object in the PpDailyAverage table
TradeDailyAverage.create(date: date, averageprice: dailyaverage)
这可行,但由于这将是一个每小时 抽成任务,每小时都会有新价格出现,我该如何更改它以首先找到 date 的 TradeDailyAverage,如果它存在,更新averageprice 属性,如果不存在则创建新记录。
Validate_uniqueness 在 TradeDailyAverage 模型上设置。
更新
当我这样做时,会出现 7 个具有准确平均值的项目。但他们就是不会保存。当我添加 newaverage.save! 时,我收到 “验证错误:日期已被占用!”
newaverage = TradeDailyAverage.find_or_initialize_by_date(date: date)
newaverage.averageprice = dailyaverage
puts newaverage.date
puts newaverage.averageprice
另外,如果我做 newaverage.new_record?曾经平均回报 TRUE
【问题讨论】:
标签: ruby-on-rails postgresql activerecord