我正在编写一个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值吗?