ruby-on-rails - rake db::migrate 是如何工作的

标签 ruby-on-rails ruby rake

我刚刚真正开始使用 Ruby 和 Rails,我发现自己真正喜欢的事情之一就是它让您使用的约定。

我想在我自己的非 Ruby 项目中模仿这种行为。

我的问题是它实际上是如何工作的?我知道我可以查看 Rails 代码,但我的理解还不够深入,无法了解其中发生了什么。

我知道它需要一个基线脚本,然后针对它运行更新架构更改。但是它怎么知道它的版本是什么?我如何在另一个框架/数据库中模仿它?

最佳答案

注意:目前 Rails 2.x 也是如此。它可能不适用于 Rails 3,因为我花在 Rails 3 上的时间没有我希望的那么多。

Rails 创建了一个名为 schema_migrations 的特殊隐藏表。该表有一个名为 version 的列。对于您拥有的每个迁移,此列中都有一行。该值是与迁移文件名时间戳匹配的时间戳。

迁移时,它会按时间顺序查看所有迁移(由于基于时间戳的命名约定,也恰好按字母顺序排列)。对于每次迁移,它都会在 schema_migrations 表中查找匹配的行。如果找不到,则运行该迁移,并将时间戳添加到表中。如果它确实找到了一个,它会假设它已经运行并简单地跳过它。

结果是 2 个开发人员都可以按任何顺序提交迁移,这很好。这是因为 Rails 确切地知道哪些迁移已运行,哪些尚未运行,无论您的数据库何时第一次看到它们。

因此,要自己做这样的事情,您只需要一种方法来永久存储此状态,以了解哪些步骤已执行,哪些尚未执行。

关于ruby-on-rails - rake db::migrate 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235899/

相关文章:

ruby-on-rails - 使用渲染模板app/app/views在heroku上进行怪异的渲染

ruby - 为什么 Mechanize 不搜索此表格?

ruby-on-rails - Ruby on Rails MySQL 数据库迁移中止 Rake

ruby-on-rails - 使用 block 命名和创建实例变量 [Ruby-on-Rails]

ruby-on-rails - 缩放图像时回形针错误 NotIdentifiedByImageMagickError

ruby-on-rails - 如何使用嵌套 if 语句从 if 语句设置变量

ruby-on-rails - 测试字段在 mongoid 中键入一个模型

ruby-on-rails - ActiveRecord::ReadOnlyRecord:Diff 在 destroy_all 上被标记为只读

ruby-on-rails - Rails : Could not find rake-10. 1.1 在任何来源

mysql - rake 数据库 :migrate got rake aborted