Find_or_initialize_by问题

时间:2013-01-04 20:14:51

标签: ruby-on-rails postgresql activerecord

我有一个名为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

2 个答案:

答案 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提供了一些很好的信息,但后来帮助了我。