Rails通过模型生成迁移

6
我一直在阅读Rails Migrations,以帮助我开始构建一个rails项目。
我对在db/migrate文件夹中生成文件有点困惑。
我设计应用程序的方式是从模型开始...尽可能详细地描述系统中将要拥有的所有对象。我希望能够使用rails迁移生成器自动从这些模型中生成迁移文件。
是的,我知道“手动创建迁移很容易”。我知道我可以手动完成,但我不明白为什么工具与预先创建的模型分开。
根据我从文章和其他关于迁移的问题中的理解,我可以像这样生成一个迁移:
rails generate migration SomeObj field:string some_other_field:integer

我不明白的是为什么当我的模型已经存在SomeObj时,我需要传入字段?Rails无法从some_obj.rb中检测并创建迁移吗?
此外,当我有一个更复杂的模型,具有has_many、belongs_to和has_and_belongs_to_many关系时,如果它自动创建具有正确名称的JOIN表和字段(例如foreign_obj_id,foreign_obj_ids),那将非常好。
在之前的项目中,我不需要处理迁移,因为我使用了Mongo+Mongoid - 由于Mongo的工作方式,集合会自动生成(不存在的集合在插入或更新时会自动创建)。现在,我在这个Rails应用中使用Postgres(但我确信在MySQL或任何其他关系数据库中也会发生同样的事情)。
无论如何,难道没有帮助程序来处理这种事情吗?我必须手动创建所有这些迁移吗?
1个回答

17
你的理解是相反的。你需要先构建迁移(migrations),再创建模型(models)。迁移可以推进数据库的状态,而模型反映了数据库的当前状态。模型与迁移之间没有一对一的映射。
引用:
我想使用 Rails 迁移生成器自动从这些模型中生成迁移文件。
无法实现。
你可以使用 `rails generate migration` 生成迁移,它会附带生成一个存根模型文件,但你不能使用现有模型文件来生成模型的迁移,因为模型不包含组成模型的实际列信息。Rails 必须从关联/验证中提取并推断所有必要的信息,即使如此,也会大多数列都是错误的。
引用:
而且,当我有一个更复杂的模型时,如果它自动创建具有正确名称的连接表和字段,那就太好了。
同样,不能这样做。你需要负责定义数据库架构的方式是通过构建迁移。你可以手动完成,也可以通过 `rails generate` 完成,但你应该遵循的流程是先构建迁移,然后再创建模型。
以下是一个完整、准备投入生产的模型的例子:
class MyModel < ActiveRecord::Base
end

这个模型定义可能包含了一个包含10列或1000列的表格;你(和Rails)完全无法根据模型定义知道表格的具体情况。

这是另一个模型,它至少包含一列,但同样地,你无法确定这列的类型:

class MyModel < ActiveRecord::Base
  validates :code, presence: true, uniqueness: true
end

“code”是字符串还是数字?该列是否应该建立索引?没有办法确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接