ruby-on-rails - 使用 Gerrit 部署 Ruby on Rails 数据库

标签 ruby-on-rails ruby database version-control

我正在考虑在我的下一个项目中使用 Ruby on Rails。了解 Rails 网站的部署很容易理解(听起来我会使用 Phusion Passenger )

但现在我正试图找出数据库。我看到很多关于“数据库迁移”的内容,它允许我使用 ruby​​ 代码更新数据库。我还看到我被允许创建这些迁移的updown 变体。

但是,我只能理解这是如何在一个方向上干净利落地工作的。想象一下,如果我突然说“颜色列不能为空”。因此,up 将使其成为必需项并为所有 NULL 条目提供默认值。但是向下会做什么呢?如果您关心它与它的开始方式相同,则不能将默认值设置回 NULL。

这对于发布到生产环境来说并不重要。这可能只会在一个方向上完成(在向上方向)。 但是,我想使用 Gerrit 进行代码审查,并设置一个机器人来在允许 checkin 之前运行构建...

那怎么可能呢?从一次代码审查到下一次,构建服务器将 checkout 新的代码集,并运行迁移?但是这样的话,它连之前的迁移代码都不会保留了,它怎么跑down步骤呢?作为一个更简单的示例,我看不出如何检查旧版本的代码并向后“迁移数据库”。

最佳答案

是的,您不能 checkout 旧版本的代码,然后从新版本的代码运行向下迁移。在回滚到旧代码之前,您需要运行向下迁移。

在很多情况下,向下迁移是不切实际或不可能的。这不一定是坏事。这只是意味着您已经定义了一个“不归路点”,您将无法将数据库恢复到之前的状态。

创建表或添加列之类的迁移很容易通过简单地销毁该表或删除该列来撤销。但是,如果您正在做一些更复杂的事情,例如添加默认值或四处移动数据,那么您可以告诉 Rails 无法撤消此迁移:

def down
  raise ActiveRecord::IrreversibleMigration
end

我建议 Gerrit 永远不要对数据库做任何假设。每次部署新版本时,它都应该从一个新的数据库开始,然后运行 ​​db:migrate 来运行所有迁移。您可以使用像 factory_girl 这样的 gem 使用演示数据填充您的应用以进行测试。

关于ruby-on-rails - 使用 Gerrit 部署 Ruby on Rails 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095090/

相关文章:

ruby-on-rails - 检查字符串中是否有大于 15 个字符的单词

ruby-on-rails - 在 Gemfile 中设置 ruby​​ 版本

ruby:instance_eval 一个文件,同时在堆栈跟踪中维护文件:行?

MongoDB 错误 : couldn't connect to server . .. 在 createPrivateMap 中打开/创建失败

ruby-on-rails - rails : PayPal Integration: "Load Configurations from specified file"?

ruby-on-rails - 谷歌地图 API 简单标记

ruby-on-rails - 使用子字符串生成随机数

python - 在数据库中具有类似实例的行为

mysql - VB.NET:用Mysql数据库部署windows form应用项目可行吗?

ruby-on-rails - DatabaseCleaner 不要重置 Rails 测试单元中的自动增量索引