過去 10 年間の時間料金を調べ、過去 7 日間の毎日の平均料金を返す次の準高度な DB クエリがあります。
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)
これは機能しますが、これは 1 時間ごとのRake Taskであり、新しい価格が 1 時間ごとに入力されるため、これを変更して最初に 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 を返します