4

我一直在阅读Rails Migrations以帮助我开始构建 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 或任何其他关系数据库也会发生同样的事情)。

反正这种事情就没有帮手吗?我必须手动创建所有这些迁移吗?

4

1 回答 1

14

你把这个弄反了。您需要先构建迁移,然后再构建模型。迁移会提升数据库的状态。您的模型反映了数据库的当前状态。模型与迁移之间没有一对一的映射。

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

做不到。

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

此外,当我有一个更复杂的模型时,......如果它自动创建具有正确名称的 JOIN 表和字段,那就太好了

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

举例来说,这是一个完整的模型,可用于生产:

class MyModel < ActiveRecord::Base
end

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

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

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

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

于 2013-01-22T05:25:00.807 回答