根据 Rails 文档:http://guides.rubyonrails.org/migrations.html
“Active Record 跟踪哪些迁移已经运行,所以你所要做的就是更新你的源并运行 rake db:migrate。”
ActiveRecord 实际上是如何做到这一点的? Active Record 将数据存储在哪里?
我怀疑这可能存储在数据库本身中?在某处的桌子上。
在我的开发机器上,我运行了所有迁移。然后我使用 mysqldump 复制了生产数据库。然后我运行“rake db:migrate:status”,它正确显示了需要在生产数据库上运行的迁移。
我曾经认为 ActiveRecord 使用时间戳来跟踪上次迁移运行。但我认为这不是真的,因为 ActiveRecord 正确运行从另一个代码分支合并的“旧”迁移。
有内幕的人可以详细说明吗?谢谢
Rails 在您的数据库中创建一个名为 schema_migrations
的表来跟踪已运行的迁移。
该表包含一个列 version
。当 Rails 运行迁移时,它采用迁移文件名中的前导数字并为该“版本”插入一行,表明它已经运行。如果您回滚该迁移,Rails 将从 schema_migrations
中删除相应的行。
例如,运行名为 20120620193144_create_users.rb
的迁移文件会将版本为 20120620193144
的新行插入到 schema_migrations
表中。
您可以随时使用早期版本引入迁移。 Rails 将始终运行 schema_migrations
中没有相应行的任何新迁移。前导数字不必是时间戳,您可以将迁移称为 001_blah.rb
。早期版本的 Rails 使用这种格式,并为新生成的迁移使用顺序编号。更高版本已切换到时间戳,以帮助防止多个开发人员独立生成具有相同编号的迁移。