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

"活动记录跟踪已经运行的迁移,所以您只需更新源代码并运行rake db:migrate."

ActiveRecord实际上是如何做到这一点的?活动记录在哪里存储数据?

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

在我的开发机器上,我运行了所有migrations.然后我用mysqldump复制了生产数据库.然后我运行了"rake db:migrate:status",它正确地显示了需要在生产数据库上运行的migrations.

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

有人能详细解释一下吗?

推荐答案

Rails在数据库中创建一个名为schema_migrations的表,以跟踪运行了哪些migrations.

该表只包含一列version.当Rails运行迁移时,它会获取迁移文件名中的前导数字,并为该"版本"插入一行,表明它已运行.如果回滚该迁移,Rails将从schema_migrations中删除相应的行.

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

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

Ruby-on-rails相关问答推荐

Rails 7中的Turbo流

ruby on rails 中的自定义关联

Ruby on rails 查询不知道怎么写

Rails - 如何使用子对象的嵌套属性和强参数填充父对象ID?

ruby on rails 和 javascript 之间的时间转换反之亦然?

为什么在保存对象后使用重新加载方法? (Hartl Rails Tut 6.30)

使用 Ruby on Rails 从原始 IP 地址获取用户国家名称

使用 Devise 令牌登录,这是内置的吗?

Ruby 元素是否存在于数组中

Rails:参数太少

Ruby如何写入Tempfile

Rails:从视图内渲染视图(不是部分视图)

如何在 Rails 中测试助手?

如何使用 Ruby 在现有 PDF 上编辑或书写?

按周/月/等和 ActiveRecord 分组?

Rails 3.1 Sprockets 需要指令 - 有没有办法排除特定文件?

我可以在 Ubuntu 上使用 apt-get 安装 gems 吗?

如何打印出范围之间的随机数?

为什么不对 Rspec + Selenium 使用共享的 ActiveRecord 连接?

设置EDITOR或BUNDLER_EDITOR环境变量