1

我正在编写一个premium_from在 postgres 表中填充 datetime 列的 rails 迁移。

我对人口没有任何问题,但是我一直在为迁移编写回滚方法,因为当我尝试将 datetime 属性更改回nil. 我也无法得到任何有用的错误消息,所以我完全不确定发生了什么。

这是我最近的迭代(出于绝望,我尝试单独处理帐户,因为似乎也没有其他方法):

def self.down
  Account.where('premium_from is not null').each do |a| 
    a.update_attribute(:premium_from, 'null')
  end
end

这愉快地运行了大约 7 秒钟,然后让我所有填充的premium_from条目仍然完好无损,我也无法在谷歌中找到任何有用的东西。

有人知道如何nil在 postgres 中设置日期时间列条目吗?

还是我只是忽略了一些明显的东西?

编辑:向上看起来像这样

csv.each do |row|
  if account = Account.premium.find_by_name(row.first)
    # This .find is necessary because .premium uses a join, meaning that it returns
    # read-only objects
    Account.find(account.id).update_attribute(:premium_from, Time.parse(row.last))
  end
end
4

2 回答 2

2

首先,我会避免在迁移中引用Account类,除非您Account在迁移本身中定义了一个类。这始终是明智的做法,因为您可能会重构Account该类并在将来将其命名为不同的名称,这样迁移就不会运行。class Account < ActiveRecord::Base; end应该做的事情。

在这种情况下,我建议只使用 SQL。它很简单,并且性能会更好。无需将所有这些记录带入并构建 AR 对象,只需发布​​更新即可。这是我的做法:

execute "UPDATE accounts SET premium_from = NULL where premium_from IS NOT NULL;"
于 2012-07-31T15:47:26.397 回答
0

你试过了吗 :

a.update_attribute(:premium_from, nil)

您的列是否允许在 postgres 中使用空值?

于 2012-07-31T15:37:54.313 回答