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



我正在编写一个rails迁移,它填充postgres表中的premium_from日期时间列。

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

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

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

这愉快地运行了大约7秒,然后留下了所有填充的premium_from条目,并且我在谷歌中也找不到任何有用的东西。

有人知道如何在postgres中将日期时间列条目设置为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

首先,我会避免在迁移中引用Account类,除非您在迁移本身中定义了Account类。这始终是明智的做法,因为您可能会重构Account类,并在将来对其进行不同的调用,然后这种迁移就不会运行了。像class Account < ActiveRecord::Base; end这样的东西应该做。

考虑到这一点,我建议在这种情况下只使用SQL。它很简单,而且会表现得更好。没有必要把所有这些记录都带进来,构建AR对象,只是为了发布更新。以下是我的做法:

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

你尝试过吗:

a.update_attribute(:premium_from, nil)

您的列允许postgres中的null值吗?

相关内容

  • 没有找到相关文章

最新更新