Ruby on rails 在rails迁移中将postgres datetime列设置为nil

Ruby on rails 在rails迁移中将postgres datetime列设置为nil,ruby-on-rails,postgresql,rails-migrations,Ruby On Rails,Postgresql,Rails Migrations,我正在编写一个rails迁移,它从postgres表中的datetime列填充一个premium\u 我对总体没有问题,但我一直在为迁移编写回滚方法,因为当我试图将datetime属性更改回nil时,rails或postgres似乎什么都没做。我也无法得到任何有用的错误消息,所以我根本不知道发生了什么 这是我最近的一次迭代(出于绝望,我试着单独处理这些帐户,因为其他的似乎都不起作用): 它愉快地运行了大约7秒钟,然后留下了所有从中填充的premium\u条目,仍然完好无损,我在谷歌也找不到任何有

我正在编写一个rails迁移,它从postgres表中的datetime列填充一个
premium\u

我对总体没有问题,但我一直在为迁移编写回滚方法,因为当我试图将datetime属性更改回
nil
时,rails或postgres似乎什么都没做。我也无法得到任何有用的错误消息,所以我根本不知道发生了什么

这是我最近的一次迭代(出于绝望,我试着单独处理这些帐户,因为其他的似乎都不起作用):

它愉快地运行了大约7秒钟,然后留下了所有从
中填充的
premium\u条目,仍然完好无损,我在谷歌也找不到任何有用的东西

有人知道如何在postgres中将datetime列条目设置为
nil

还是我忽略了一些显而易见的事情

编辑:上面看起来像这样

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
您是否尝试过:

a.update_attribute(:premium_from, nil)

您的列在postgres中允许空值吗?

首先,我会避免在迁移中引用
Account
类,除非您在迁移本身中定义了
Account
类。这始终是明智的做法,因为您可能会重构
Account
类,并在将来将其称为不同的类,然后此迁移将不会运行。类似于
classaccount
应该这样做

为了避免这种情况,我建议在这种情况下只使用SQL。它足够简单,而且会表现得更好。不需要为了发布更新而引入所有这些记录并构建AR对象。我是这样做的:

execute "UPDATE accounts SET premium_from = NULL where premium_from IS NOT NULL;"

把它加进去。如果您想知道的话,
中的
premium\u列是在以前的迁移中添加的。Boom,工作得很好。我知道这很容易!关于
帐户
——这在应用程序中是非常重要的,所以将来它真的不可能被更改。虽然这是个好建议,但我以后会记住。我确实试过了,但也没用——我真的不知道那里发生了什么。hgmnz的SQL很好地完成了这项工作。
execute "UPDATE accounts SET premium_from = NULL where premium_from IS NOT NULL;"