0

我有一个名为 TradeDailyAverage 的模型的数据库表。它有一个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
4

2 回答 2

3

如果你想使用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_bybut find_or_create_by。这样,如果记录不存在,则直接将新记录写入数据库。现在update_attributes应该可以工作了,因为您总是可以取回持久记录。请注意,这种方法的缺点是您在没有averageprice数据库的情况下保存记录。我不建议这样做。

上面的解释也应该解释你的第二个例子:

newaverage = TradeDailyAverage.find_or_initialize_by_date(date)
puts newaverage.averageprice
puts newaverage.date

这应该输出averageprice持久记录的和日期。如果你得到一个新初始化的记录,它只会显示日期。由于您仅使用日期对象初始化记录,因此无法averageprice设置 。

于 2013-01-05T10:56:54.280 回答
1

我的问题很简单,在保存到我的数据库后,PostgreSQL 正在更改每小时时间,可能是由于时区问题。因此,我上面的所有实例都是新的,我无法更新现有模型的属性。因此,我将 datetime 数据转换为日期,将 date db 列更改为 date 而不是 datetime,现在一切正常。Yves 在上面提供了一些很棒的信息,但后来对我有所帮助。

于 2013-01-05T18:36:31.797 回答