Ruby on rails Rails随时间迁移

Ruby on rails Rails随时间迁移,ruby-on-rails,migration,Ruby On Rails,Migration,我有一个表,其中日期存储为unix时间戳(INT)。我希望我的迁移将这些int移到另一列,将第一列的类型更改为datetime,然后将int转换为ruby times,并将它们放回第一列。这是我的迁移: def self.up add_column :events, :start_date_int, :int Event.all.each do |event| event.start_date_int = event.start_date even

我有一个表,其中日期存储为unix时间戳(INT)。我希望我的迁移将这些int移到另一列,将第一列的类型更改为datetime,然后将int转换为ruby times,并将它们放回第一列。这是我的迁移:

def self.up
    add_column :events, :start_date_int, :int
    Event.all.each do |event|
        event.start_date_int = event.start_date
        event.save
    end
    change_column :events, :start_date, :datetime

    Event.all.each do |event|
    time = Time.at(event.start_date_int)    
        event.start_date = time
        puts time
        puts event.start_date
        event.save
    end
end
终端输出如下:

==  DatesToDates: migrating ===================================================
-- add_column(:events, :start_int, :int)
-> 0.2880s
-- add_column(:events, :end_int, :int)
-> 0.3138s
-- change_column(:events, :start, :datetime)
-> 0.2695s
-- change_column(:events, :end, :datetime)
-> 0.2959s
Sun May 01 13:00:00 -0400 2011
1304269200
==  DatesToDates: migrated (1.2923s) ==========================================
(开发数据库中只有1个事件)

出于某种原因,event.start_date=尝试将整数粘贴到event.start_date而不是转换的时间的时间。如果我将第二个循环分离到另一个迁移中,并分别运行这两个迁移(分别通过db:migrate:up VERSION=X),那么一切都正常工作,但是如果两个迁移都通过一个普通的db:migrate一起运行,即使它们位于不同的文件中,它也会失败。有什么想法吗


(这是带有MySQL的rails 3)

您可能想看看。我猜这是您的问题,因为您提到,如果您单独进行迁移,它会起作用,但如果一起运行,则不会起作用。

这很有效。。。只是停留在Event.reset\u column\u信息中,没有其他问题。谢谢:-)今天早上醒来,我意识到我也可以创建一个新列作为datetime,转换int并将其粘贴到新列中,然后删除原来的。。。更干净。我不会称一列为“end”,因为它是Ruby中的一个关键字<代码>结束时间更好。