我有一个名为TradeDailyAverage的模型的数据库表。它有date
(日期时间)& averageprice
(十进制)列
当我运行它时,我无法获得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
在保存之前,我需要做些什么特别的平均价格吗?
以下是整个佣金任务的全部内容供您参考:
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
答案 0 :(得分:3)
如果您想使用find_or_initialize_by
,您需要仔细考虑其含义。让我们举个例子:
newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
newaverage.update_attributes :averageprice => dailyaverage
当给定TradeDailyAverage
的{{1}}已在数据库中时,这应该有效。但是,当你获得新记录时,它不应该工作。原因很简单,因为新记录不会持久存储到数据库中。 date
无法更新非持久记录。你有两个选择:
1。)不要使用update_attributes
,而是分配值并致电update_attributes
。这适用于新记录和创建记录:
save
2.。)不要使用 newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
newaverage.averageprice = dailyaverage
newaverage.save
,而是使用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
。
答案 1 :(得分:1)
我的问题只是在保存到我的数据库后,PostgreSQL正在改变每小时的时间,可能是由于时区问题。因此,我上面的所有实例都是新的,我无法更新现有模型的属性。所以,我将我的日期时间数据转换为日期,将日期数据库列更改为日期而不是日期时间,现在一切都顺利进行。 Yves提供了一些很好的信息,但后来帮助了我。