Rails如何跟踪为数据库运行哪些迁移?

根据Rails doc: http : //guides.rubyonrails.org/migrations.html

“Active Record跟踪哪些迁移已经运行,所以您只需更新源代码并运行rake db:migrate。”

ActiveRecord究竟如何做到这一点? Active Record在哪里存储数据?

我怀疑这可能存储在数据库本身? 在某个地方的桌子上。

在我的开发机器上,我运行了所有的迁移。 然后我使用mysqldump复制生产数据库。 然后我运行“rake db:migrate:status”,它正确显示了需要在生产数据库上运行的迁移。

我曾经认为,ActiveRecord跟踪使用时间戳的上次迁移运行。 但我认为这是不正确的,因为ActiveRecord正确运行从另一个代码分支合并的“旧”迁移。

有内幕知识的人可以详细说明吗? 谢谢

Rails在数据库中创build一个名为schema_migrations的表来跟踪哪些迁移已经运行。

该表包含单个列, version 。 当Rails运行迁移时,迁移的文件名中包含前几位,并为该“版本”插入一行,表示已经运行。 如果您回滚该迁移,Rails将从schema_migrations删除相应的行。

例如,运行名为schema_migrations的迁移文件将在版本为schema_migrations的新行中插入schema_migrations表。

您随时可以免费使用早期版本的迁移。 Rails将始终运行schema_migrations没有相应行的新迁移。 001_blah.rb数字不一定是时间戳,你可以调用你的移植001_blah.rb 。 早期版本的Rails使用这种格式,并为新生成的迁移使用顺序编号。 后来的版本已经切换到时间戳,以帮助防止多个开发人员独立地生成具有相同编号的迁移。