如何将模型转换为迁移

时间:2015-06-19 15:27:44

标签: ruby-on-rails

我对此感到有点困惑。在创建模型时,我一直认为这会产生迁移,然后将其推送到数据库中。 所以当我输入

rails g model用户名:string email:string group:integer

我得到的模型中的

class Userss < ActiveRecord::Base
end

并在迁移(20150619151857_create_usersses.rb)中得到:

class CreateUsersses < ActiveRecord::Migration
  def change
    create_table :usersses do |t|
      t.string :name
      t.string :email
      t.integer :group

      t.timestamps
    end
  end
end

但是,如果我输入rails g model Userss name:string email:string group:integer --migration=false

我得到相同的模型,但是当我运行迁移时 rails g migration userss,我收到的文件名为....create_userss.rb,但名为20150619152316_userss.rb,其中包含:

class Userss < ActiveRecord::Migration
  def change
  end
end

那么为什么迁移文件存在差异?

2 个答案:

答案 0 :(得分:2)

如果要创建将列添加到Userss表的迁移,请执行以下操作:

rails g migration add_fields_to_userss name:string email:string group:integer

这将创建一个迁移以将列添加到现有表。如果您不在最后添加_to_userss,那么它只会为您创建一个通用的迁移文件。

rails g model Userss name:string ... 将创建一个迁移,在运行时,将创建具有指定列的用户表。

rails g migration blah_blah_blah_to_userss name:string ...将创建一个仅向现有用户表添加列和引用的迁移。

答案 1 :(得分:2)

我认为您对rails迁移生成器的工作原理感到困惑。他们实际上并不关心你的模特。

当你跑步时:

rails g model user name:string

Rails只为您运行迁移生成器:

rails g migration CreateUsers name:string

Rails可以从迁移的命名中找出要生成的迁移类型。 CreateUsers name:string显然会创建一个创建表迁移。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
    end
  end
end

AddFooToUsers foo:int将创建迁移以更改users

class AddFooToUsers < ActiveRecord::Migration
  def change
    add_column :users, :foo, :int
  end
end

如果您使用camelcase或snakecase为生成器add_fields_to_usersAddFieldsToUsers中的迁移名称提供相同的结果,则Rails并不在意。

Rails惯例也是使用单数形式的模型名称(用户,水果,汽车等),这非常重要,因为它让rails自动找出控制器和模型之间的连接。

更重要的是,你不会拼错用户之类的常用英语单词,因为它会让每个必须维护代码的可怜的人都感到困惑。