我一直在阅读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关系时,如果它使用正确的名称(例如foreign_obj_id,foreign_obj_ids)自动处理JOIN表和字段,那将是非常好的
在之前的项目中,我没有处理迁移,因为我使用了Mongo + Mongoid - 由于Mongo的工作原理,自动生成了集合(插入或更新时自动创建了不存在的集合) )。现在使用这个Rails应用程序我正在使用Postgres(但我确信MySQL或任何其他关系数据库会发生同样的事情)。
无论如何,这种事情没有帮手吗?我是否必须手动创建所有这些迁移?
答案 0 :(得分:12)
你已经倒退了。您需要先构建迁移,然后再建立模型。迁移可以提升数据库的状态。您的模型反映了数据库的当前状态。模型与迁移之间没有一对一的映射。
我想使用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
是字符串还是数字?列上应该有索引吗?绝对没有办法知道。