Rails:schema.rb做什么?

Lai*_*uan 69 activerecord ruby-on-rails

我曾经认为db/schema.rbRails项目中存储了数据库模式,因此ActiveRecord可以知道它具有哪些表/列.

但早些时候我惊奇地注意到我的项目在删除后正常运行db/schema.rb!

那么,既然Rails没有它可以工作,那schema.rb真正做到了什么?

Hol*_*ust 100

schema.rb主要有两个目的:

  1. 它记录了数据库模式的最终当前状态.通常,特别是当您进行多次迁移时,仅从迁移中删除模式很困难.有礼物schema.rb,你可以看看那里.ActiveRecord本身确实不会使用它.它将在运行时期间对数据库进行内省,因为这比期望用户保持schema.rb最新更安全.但是,为了避免开发人员混淆,您应该始终维护一个与您的迁移最新的文件.

  2. 测试使用它来填充数据库模式.因此,这rake db:schema:dump通常作为佣金test:prepare运行的一部分运行.目的是测试数据库的模式与当前开发数据库完全匹配.

  • 我认为应该期望用户将`schema.rb`保持为日期,因为对同一文件的注释说明:_注意此schema.rb定义是数据库模式的权威来源. (2认同)

not*_*tch 7

Rails 文档 / 6.1 Schema 文件的用途是什么?

迁移,尽管可能很强大,但并不是您的数据库模式的权威来源。该角色属于 db/schema.rb 或 Active Record 通过检查数据库生成的 SQL 文件。它们不是为编辑而设计的,它们只是代表数据库的当前状态。

无需(而且很容易出错)通过重放整个迁移历史来部署应用程序的新实例。将当前模式的描述加载到数据库中要简单得多,速度也更快。

例如,测试数据库是这样创建的:将当前的开发数据库转储(转储到 db/schema.rb 或 db/structure.sql),然后加载到测试数据库中。

如果您想快速查看 Active Record 对象具有哪些属性,架构文件也很有用。此信息不在模型的代码中,并且经常分布在多个迁移中,但该信息很好地总结在模式文件中。如果您需要该功能, annotate_models gem 会自动添加和更新每个模型顶部的注释,总结模式。

Rails 文档已经涵盖了您。