我刚刚开始使用Ruby和Rails,我发现自己真正喜欢的一件事是它让你使用的约定。
我想在我自己的非Ruby项目中模仿这种行为。
我的问题是它是如何运作的?我知道我可以浏览一下Rails代码,但是我的理解还不够,知道它里面发生了什么。
我知道它需要一个基线脚本,然后针对它运行更新架构更改。但它怎么知道它的版本是什么?我如何在另一个框架/数据库中模仿它?
答案 0 :(得分:23)
注意:就Rails 2.x而言,这是真的。它可能不适用于rails 3,因为我没有像我希望的那样在Rails 3上花费太多时间。
Rails创建一个名为schema_migrations
的特殊隐藏表。此表有一个名为version
的列。对于您的每次迁移,此列中都有一行。该值是与迁移文件名时间戳匹配的时间戳。
迁移时,它会按时间顺序查看所有迁移(由于基于timstamp的命名约定,也恰好按字母顺序排序)。对于每次迁移,它会在schema_migrations
表中查找匹配的行。如果找不到,则运行该迁移,并添加表的时间戳。如果确实找到一个,它会假定它已经运行并且只是跳过它。
结果是2个开发人员都可以按任何顺序提交迁移,并且没关系。这是因为无论数据库何时第一次看到它们,Rails都确切知道哪些迁移已经运行,哪些没有。
所以要自己做这样的事情,你只需要一种方法来永久存储这个状态,说明采取了哪些步骤,哪些步骤没有。