我有一个名为TradeDailyAverage的模型的DB表。它有一个date
(DateTime)&averageprice
(decimal)列
运行此命令时,无法更新averageprice属性:
newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
newaverage.update_attributes :averageprice => dailyaverage
此外,当我运行此命令时,日期将显示出来,但平均价格不会显示在rails控制台中它只显示为空白:
newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
puts newaverage.averageprice
puts newaverage.date
在保存之前,我需要对平均价格做些什么特别的事情吗?
以下是所有的Rake任务供您参考:
averages = Trade.where('date >= ?', 7.days.ago).average(:price, :group => "DATE_TRUNC('day', date - INTERVAL '1 hour')")
# 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)
newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
newaverage.update_attributes :averageprice => dailyaverage
最佳答案
如果你想使用find_or_initialize_by
你需要仔细考虑它的含义。让我们举第一个例子:
newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
newaverage.update_attributes :averageprice => dailyaverage
当给定的
TradeDailyAverage
的date
已经在数据库中时,这应该可以工作。但是,当你重新获得一张新唱片时,它不应该起作用。原因很简单,因为新记录没有持久化到数据库。update_attributes
无法更新非持久记录。你有两个选择:1.)不要使用
update_attributes
而是分配值并调用save
。这对新建和创建的记录都有效: newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
newaverage.averageprice = dailyaverage
newaverage.save
2.)不要使用
find_or_initialize_by
而是find_or_create_by
。这样,如果记录不存在,则直接将新的记录写入数据库。现在update_attributes
应该可以工作了,因为您总是会得到持久化的记录。注意,这种方法有一个缺点,那就是您将记录保存到数据库时没有averageprice
。我不建议这样做。上面的解释也应该解释您的第二个示例:
newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
puts newaverage.averageprice
puts newaverage.date
这将输出
averageprice
和持久记录的日期。如果你得到一条新初始化的记录,它将只显示日期。由于您只使用日期对象初始化记录,因此无法设置averageprice
。