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

时间:2012-07-31 15:35:35

标签: ruby-on-rails postgresql rails-migrations

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

2 个答案:

答案 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中使用空值?