在rails数据库迁移中添加新列

时间:2014-10-29 19:28:00

标签: ruby-on-rails ruby-on-rails-4 database-migration rails-migrations

所以我一直在阅读很多rails教程,并且我知道向数据库添加新列的默认值是,例如,

rails generate migration add_reset_to_users reset_digest:string reset_sent_at:datetime

以上内容将以字符串形式添加reset_digest,并以日期的形式向reset_sent_at添加reset_reset_to_users

我的问题是,如果我在凌晨4点笨拙而只打电话给以下

rails generate migration add_reset_to_users reset_digest:string

我完全忘记了reset_sent_at,但希望第二天早上实现它。我错误地将链接直接添加到db文件,这是一个巨大的错误。

在这种情况下,我该怎么办?我是否只是调用新的迁移,例如

rails generate migration add_reset_sent_to_users reset_sent_at:datetime

还是有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

首先,如果您尚未运行迁移,则可以直接打开迁移文件,并将列添加到文件中,如

def change
 add columns :table_name :column_name :column_type
end

在您的情况下,您将文件修改为,

def change
 add columns :users :reset_digest :string
 add columns :users :reset_sent_at :datetime
end

然后运行

rake db:migrate

如果您已经运行了迁移,并且之后没有运行任何其他迁移,则可以通过

撤消迁移
rake db:rollback STEP=1

然后编辑迁移文件,然后运行迁移

答案 1 :(得分:0)

Rails中迁移的经验法则是,除非您尚未与其他人共享代码,即推送到远程存储库,否则始终会创建新的迁移文件,否则您只需在运行{{1}后更改旧迁移一切都会好的,没有人会知道它,并且不会影响其他开发人员的工作(因为它仍然在你的本地存储库中)。

因此,如果您已经提交并将代码推送到远程存储库,并且再次更改旧的迁移文件会损害其他开发人员的工作效率,我建议您创建新的迁移。如果有任何混淆,请始终创建新的迁移:

$ rake db:rollback

答案 2 :(得分:0)

我认为这取决于你的rails应用程序的状态。

如果您正在使用生产应用程序,那么由于数据丢失而不建议编辑迁移,并且应该使用新的迁移进行更改。

如果您在开发中本地工作,那么我将直接编辑迁移并添加缺少的列并重新运行迁移。

不要担心编辑迁移,只需记住在进行更改之前rake db:rollback正在编辑的迁移,否则您将遇到错误。

这是从以下地方更改迁移的地方:

def change

    add_column('users', 'reset_digest', :string) 
    add_column('users', 'reset_sent_at', :datetime) # Would have to perform rollback before adding this line


end 

为:

def up

    add_column('users', 'reset_digest', :string) 
    add_column('users', 'reset_sent_at', :datetime) # Added after migration

    **rake db:migrate

end

def down

    remove_column('users', 'reset_digest', :string) 
    remove_column('users', 'reset_sent_at', :datetime) # Add this after rollback
   **rake db:rollback

end

允许您在rake db:rollback

之前对迁移进行更改

这需要更多的代码,但是当我构建一个新的应用程序并且事情经常发生变化时,我发现它更容易。