所以我一直在阅读很多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
还是有更好的方法吗?
答案 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
这需要更多的代码,但是当我构建一个新的应用程序并且事情经常发生变化时,我发现它更容易。