我有以下半高级数据库查询,它通过过去 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)
这可行,但是由于这将是一个每小时的抽水任务,每小时都会有新的价格出现,我该如何更改它以首先找到一个 TradeDailyAverage date
,如果它存在,更新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