我正在编写一个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
吗?
或者我只是忽略了一些明显的东西?
编辑:up看起来像这样
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
答案 0 :(得分:2)
首先,除非您在迁移本身中定义了Account
类,否则我将避免在迁移中引用Account
类。这总是明智的选择,因为你可以重构Account
类并在将来称它为不同的东西,然后这种迁移就不会运行了。像class Account < ActiveRecord::Base; end
这样的东西应该这样做。
在这种情况下,我建议只使用SQL。它很简单,并且会表现得更好。没有必要将所有这些记录带入并构建AR对象,只是为了发布更新。以下是我的表现:
execute "UPDATE accounts SET premium_from = NULL where premium_from IS NOT NULL;"
答案 1 :(得分:0)
你有没有尝试过:
a.update_attribute(:premium_from, nil)
你的列是否允许在postgres中使用空值?