我对此感到有点困惑。在创建模型时,我一直认为这会产生迁移,然后将其推送到数据库中。 所以当我输入
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
那么为什么迁移文件存在差异?
答案 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_users
或AddFieldsToUsers
中的迁移名称提供相同的结果,则Rails并不在意。
Rails惯例也是使用单数形式的模型名称(用户,水果,汽车等),这非常重要,因为它让rails自动找出控制器和模型之间的连接。
更重要的是,你不会拼错用户之类的常用英语单词,因为它会让每个必须维护代码的可怜的人都感到困惑。