在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
577527 次浏览

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

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

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

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

如果你已经运行了你的原始迁移(在编辑它之前),那么你需要生成一个新的迁移(rails generate migration add_email_to_users email:string就可以了)。 它将创建一个包含以下内容的迁移文件: add_column :users, email, string 然后执行rake db:migrate,它将运行新的迁移,创建新列

如果您还没有运行最初的迁移,您可以编辑它,就像您正在尝试做的那样。您的迁移代码是几乎完美的:您只需要完全删除add_column行(该代码试图在表创建之前向表添加一列,并且您的表创建代码已经更新到包含t.string :email)。

你也可以

rake db:rollback

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

rake db:migrate

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

更简单的方法是让迁移文件中的更改保持原样。 使用< / p >
$rake db:migrate:redo

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

在终端上使用此命令:

rails generate migration add_fieldname_to_tablename fieldname:string

而且

rake db:migrate

要运行此迁移

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

  1. < p > rails generate migration add_fieldname_to_tablename fieldname:string

    替代

    rails generate migration addFieldnameToTablename

    生成迁移之后,编辑迁移并定义希望添加该列的所有属性。

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

    rails generate migration addEmailToUsers < / p >

  2. rake db:migrate

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

    警告/注意

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

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

rake db:rollback STEP=1

或回滚此具体的迁移by

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

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

你也可以这样做。 Rails迁移add_column_to_users email:string

then rake db:migrate 同时在你的用户控制器中添加:email属性

要了解更多细节,请查看http://guides.rubyonrails.org/active_record_migrations.html

如果你的表已经存在,你也可以使用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 generate migration add_email_to_users email:string会产生这样的迁移

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

在这种情况下,你必须手动将add_column转换为change:

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

然后运行rake db:migrate

你也可以在迁移中使用特殊的change_table方法来添加新列:

change_table(:users) do |t|
t.column :email, :string
end

你也可以使用before column或after column将列添加到特定位置,如下所示:

rails generate migration add_dob_to_customer dob:date

迁移文件将生成除::email之外的以下代码。需要在“::email”后或“::email”前添加

class AddDobToCustomer < ActiveRecord::Migration[5.2]
def change
add_column :customers, :dob, :date, after: :email
end
end