105

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

“Active Record 跟踪哪些迁移已经运行,所以你所要做的就是更新你的源并运行 rake db:migrate。”

ActiveRecord 实际上是如何做到这一点的?Active Record 将数据存储在哪里?

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

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

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

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

4

1 回答 1

183

Rails 在您的数据库中创建一个表,schema_migrations用于跟踪已运行的迁移。

该表包含一个列,version。当 Rails 运行迁移时,它采用迁移文件名中的前导数字并为该“版本”插入一行,表明它已经运行。如果您回滚该迁移,Rails 将从schema_migrations.

例如,运行一个名为的迁移文件将在表20120620193144_create_users.rb中插入一个带有版本的新行。20120620193144schema_migrations

您可以随时使用早期版本引入迁移。Rails 将始终运行任何新的迁移,而schema_migrations. 前导数字不必是时间戳,您可以调用您的 migration 001_blah.rb。早期版本的 Rails 使用这种格式,并为新生成的迁移使用顺序编号。更高版本已切换到时间戳,以帮助防止多个开发人员独立生成具有相同编号的迁移。

于 2012-08-21T14:45:49.067 回答