在Rails迁移中将列添加到现有表中

我有一个用户模式,需要一个:email列(我忘了在最初的脚手架期间添加该列)。

我打开迁移文件并添加了t.string :email ,做了rake db:migrate ,并且得到了一个NoMethodError 。 然后我添加了这一行

 add_column :users, :email, :string 

再次rake db:migrate ,再次NoMethodError 。 我在这里错过了一步吗?

编辑:这是迁移文件。

 class CreateUsers < ActiveRecord::Migration def self.up add_column :users, :email, :string create_table :users do |t| t.string :username t.string :email t.string :crypted_password t.string :password_salt t.string :persistence_token t.timestamps end end def self.down drop_table :users end end 

如果你已经运行了原始的迁移(编辑之前),那么你需要生成一个新的迁移( rails generate migration add_email_to_users email:string将做的伎俩)。 然后做一个rake db:migrate ,它会运行新的迁移。

如果您尚未运行原始迁移,则可以对其进行编辑,就像您正在尝试的那样。 您的迁移代码几乎是完美的:您只需要完全删除add_column行(在创build表之前,代码正试图向表中添加一列,并且您的表创build代码已经更新为包含t.string :email )。

在rails控制台上使用这个命令rails generate migration add_fieldname_to_tablename fieldname:string

rake db:migrate来运行这个迁移

你也可以做

rake db:rollback

如果您尚未将任何数据添加到表中,请通过向其添加电子邮件列来编辑迁移文件,然后调用

rake db:migrate

如果您的系统中安装了rails 3.1或更高版本,这将起作用。

更简单的方法是更改​​迁移文件的更改。 使用

$rake db:migrate:redo

这将回滚上次迁移并再次迁移。

要添加一列,我只需要按照下面的步骤:

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    替代

    rails generate migration addFieldnameToTablename

    一旦迁移生成,然后编辑迁移并定义所需的列添加的所有属性。

    注意 :Rails中的表名总是复数(与DB约定匹配)。 使用前述步骤之一的示例 –

    rails generate migration addEmailToUsers

  2. rake db:migrate

要么

  1. 您可以从db/schema.rb更改模式,在SQL查询中添加所需的列。
  2. 运行这个命令: rake db:schema:load

    警告/注意事项

    请记住,运行rake db:schema:load自动清除表中的所有数据。

当我这样做了,而不是摆弄原来的迁移,我创build一个新的只有在上一节添加列和下降部分的一个下降列。

你可以改变原来的,并重新运行,如果你之间迁移,但在这种情况下,我认为这是一个迁移,将无法正常工作。

正如目前发布的那样,您正在添加该列,然后创build该表。

如果您更改订单,它可能会工作。 或者,在修改现有迁移时,只需将其添加到创build表中,而不是单独添加列。

你可以回滚最后一次迁移

 rake db:rollback STEP=1 

或者通过回滚这个特定的迁移

 rake db:migrate:down VERSION=<YYYYMMDDHHMMSS> 

并编辑文件,然后再运行rake db:mirgate

你也可以这样做。rails g migration add_column_to_users email:string

然后rake数据库:迁移也添加:在您的用户控制器的电子邮件属性;

有关更多详细信息,请访问http://guides.rubyonrails.org/active_record_migrations.html

你也可以使用force: true表中的表列force: true ,如果你的表已经存在。

例如

 ActiveRecord::Schema.define(version: 20080906171750) do create_table "authors", force: true do |t| t.string "name" t.datetime "created_at" t.datetime "updated_at" end end