我刚刚真正开始使用 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/