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