Rails从模型生成迁移

我一直在阅读有关Rails迁移的内容,以帮助我开始构建rails项目。

我对db / migrate中的文件生成感到困惑。

我设计应用程序的方式是从模型开始……尽可能地概述我将在系统中拥有的所有对象。 我想使用rails迁移生成器自动生成这些模型的迁移文件。

是的,我知道“手动创建迁移很容易。” 而且我知道我可以手动完成,但我不明白的是为什么该工具与预先创建的模型分开。

根据我对文章的理解以及关于SO的其他迁移问题,我可以生成如下迁移:

rails generate migration SomeObj field:string some_other_field:integer 

我没有得到的是为什么当我的模型已存在于SomeObj时我需要传入字段? Rails无法从some_obj.rb中检测到它并从那里创建迁移吗?

此外,当我有一个更复杂的模型,使用has_many,belongs_to和has_to_and_belongs_to_many关系时,如果它使用正确的名称自动处理JOIN表和字段(例如foreign_obj_id,foreign_obj_ids)将会非常好。

在之前的项目中,我不必处理迁移,因为我使用了Mongo + Mongoid – 由于Mongo工作原理的性质而自动生成集合(不存在的集合在插入或更新时自动创建)。 现在使用这个Rails应用程序我正在使用Postgres(但我确信MySQL或任何其他关系数据库会发生同样的事情)。

无论如何,这种事情没有帮手吗? 我是否必须手动创建所有这些迁移?

你已经倒退了。 您需要先构建迁移,然后再建立模型。 迁移推进了数据库的状态。 您的模型反映了数据库的当前状态。 模型与迁移之间没有一对一的映射。

我想使用rails迁移生成器自动生成这些模型的迁移文件。

无法做到。

您使用rails generate migration来生成迁移,这几乎作为副作用生成存根模型文件。 您无法使用现有模型文件生成模型的迁移,因为模型不包含有关组成模型的实际列的任何信息。 Rails必须从您的关联/validation中提取并暗示所有必要的信息,即使这样,它也会使大多数列错误。

此外,当我有一个更复杂的模型,…如果它使用正确的名称自动处理JOIN表和字段将是非常好的

再说一次,你不能。 您负责定义数据库模式,并且您这样做的方式是构建迁移。 您可以手动或通过rails generate执行此操作,但您应该遵循的过程是首先构建迁移,然后再建立模型。

举例来说,这是一个完整的模型,准备生产:

 class MyModel < ActiveRecord::Base end 

该模型定义可能包含一个包含10列或1000列的表; 你(和Rails)根据模型定义绝对无法知道。

这是另一个模型,其中至少包含一列,但同样,您无法知道哪种列:

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

code是字符串还是数字? 列上应该有索引吗? 绝对没有办法知道。