2011-01-29 100 views
224

我有一个需要:email列的用户模型(我忘记了在初始脚手架期间添加该列)。向Rails移植中的现有表添加列

我打开迁移文件并添加了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 

回答

432

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

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

+4

rails g migration addEmailToUsers also works – wheresmycookie 2013-06-08 19:20:43

+3

要明确一点,我们使用复数?所以它是`add_email_to_users`而不是`add_email_to_user`? – Purplejacket 2013-12-16 18:56:24

+8

正确。 Rails中的表名总是复数(以匹配DB约定)。 – camdez 2014-01-22 06:06:51

3

当我做这个,而不是摆弄原来的迁移,我创建一个新的只添加列在上升段和下降段的下降列。

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

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

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

21

你也可以做

rake db:rollback

如果您还没有添加任何数据到tables.Then通过将电子邮件列其编辑迁移文件,然后调用

rake db:migrate

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

更简单的方法是更改​​让迁移文件的更改保持原样。使用

$rake db:migrate:redo

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

76

使用在轨控制台命令 rails generate migration add_fieldname_to_tablename fieldname:string

rake db:migrate运行此迁移

15

要添加列我不得不请按照下列步骤操作:

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    你想

    替代

    rails generate migration addFieldnameToTablename

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

    注意:Rails中的表名总是复数(以匹配DB约定)。 例如使用的步骤之一提到previously-

    rails generate migration addEmailToUsers

  2. rake db:migrate

或者

  1. 您可以从db/schema.rb更改架构,添加列你想在SQL查询中。
  2. 运行以下命令:rake db:schema:load

    警告/注意

    。记住,运行rake db:schema:load自动划入您的表中的所有数据。

0

您可以通过

rake db:rollback STEP=1 

回退最后迁移或

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS> 

回滚该具体迁移和编辑文件,然后再次运行rake db:mirgate

1

也可以使用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 
1

有时rails generate migration add_email_to_users email:string产生这样

class AddEmailToUsers < ActiveRecord::Migration[5.0] 
    def change 
    end 
end 

在这种情况下,迁移,你必须手动的额外线change

class AddEmailToUsers < ActiveRecord::Migration[5.0] 
    def change 
    add_column :users, :email, :string 
    end 
end 

然后运行rake db:migrate

相关问题