我曾经认为db/schema.rb
项目中的Rails
存储了数据库架构,因此ActiveRecord
可以知道它有哪些表/列。
但早些时候我惊讶地注意到我删除db/schema.rb
之后我的项目正常运行!
那么,既然Rails
可以在没有它的情况下工作,那么schema.rb
真正做了什么?
答案 0 :(得分:98)
schema.rb
主要用于两个目的:
它记录了数据库模式的最终当前状态。通常,特别是当您进行多次迁移时,仅从迁移中删除模式很困难。有了schema.rb
,你可以看一下。 ActiveRecord本身确实不会使用它。它会在运行时期间对数据库进行内省,因为这比期望用户保持schema.rb
最新更安全。但是,为避免混淆您的开发人员,您应始终维护一个与您的迁移最新的文件。
测试使用它来填充数据库模式。因此,rake db:schema:dump
通常作为rake test:prepare
运行的一部分运行。目的是测试数据库的模式与当前的开发数据库完全匹配。
答案 1 :(得分:3)
迁移,尽管可能很强大,但并不是权威来源 对于您的数据库架构。该角色属于db / schema.rb或 Active Record通过检查数据库生成的SQL文件。他们 不是为了编辑而设计的,它们只代表当前的状态 数据库。
部署新的实例不需要(并且容易出错) 通过重播整个迁移历史记录的应用程序。它简单得多 并且更快地加载到数据库中的当前描述 架构。
例如,这是测试数据库的创建方式:当前 开发数据库被转储(到db / schema.rb或 db / structure.sql)然后加载到测试数据库中。
如果您想快速查看内容,架构文件也很有用 Active Record对象具有的属性。此信息不在 模型的代码经常分散在几个迁移中,但是 信息很好地总结在模式文件中。该 annotate_models gem会自动在顶部添加和更新注释 如果您需要该功能,请汇总每个模型。