我有一个用户模型,它需要一个: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

当前回答

你也可以

rake db:rollback

如果您没有向表中添加任何数据。然后通过向迁移文件中添加电子邮件列来编辑迁移文件,然后调用

rake db:migrate

如果您的系统中安装了3.1以上的rails,这将工作。

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

$rake db:migrate:redo

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

其他回答

你也可以

rake db:rollback

如果您没有向表中添加任何数据。然后通过向迁移文件中添加电子邮件列来编辑迁移文件,然后调用

rake db:migrate

如果您的系统中安装了3.1以上的rails,这将工作。

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

$rake db:migrate:redo

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

完成此操作后,我没有修改原来的迁移,而是在向上部分中创建了一个添加列,在向下部分中创建了一个删除列。

如果你向下迁移,你可以改变原来的并重新运行它,但在这种情况下,我认为这使得迁移不能正常工作。

如当前所述,您正在添加列,然后创建表。

如果你改变顺序,它可能会起作用。或者,在修改现有迁移时,只需将其添加到创建表中,而不是单独执行添加列。

您可以通过回滚上一次迁移

rake db:rollback STEP=1

或回滚此特定的迁移

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

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

如果您的表已经存在,您也可以使用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

要添加一个列,我只需要遵循以下步骤:

Rails生成迁移add_fieldname_to_tablename fieldname:string 替代 rails生成迁移addFieldnameToTablename 生成迁移之后,编辑迁移并定义希望添加该列的所有属性。 注意:Rails中的表名总是复数形式(以匹配DB约定)。使用前面提到的步骤之一的示例- rails生成迁移addEmailToUsers rake db: migrate

Or

您可以从db/schema中更改模式。在SQL查询中添加需要的列。 执行如下命令:rake db:schema:load 警告/注意 请记住,运行rake db:schema:load会自动擦除表中的所有数据。