在Rails迁移中向现有表添加列

Joh*_*ohn 317 ruby-on-rails-3

我有一个需要:email列的用户模型(我忘了在初始脚手架中添加该列).

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

add_column :users, :email, :string
Run Code Online (Sandbox Code Playgroud)

再次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
Run Code Online (Sandbox Code Playgroud)

Dyl*_*kow 545

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

如果您尚未运行原始迁移,则只需编辑它,就像您尝试的那样.您的迁移代码几乎是完美的:您只需要rake db:migrate完全删除该行(该代码试图在创建表之前向表中添加列,并且您的表创建代码已经更新以包含add_column任何内容).

  • rails g migration addEmailToUsers也可以 (9认同)
  • 正确.Rails中的表名总是复数(以匹配DB约定). (8认同)
  • 为了清楚起见,我们使用复数?所以它是`add_email_to_users`而不是`add_email_to_user`? (5认同)
  • 您还可以在最后一步使用 `rails db:migrate`。 (3认同)
  • @neeraj 您现在可能已经有了答案,但对于其他寻求者,是的,您可以像这样,例如`t.string :column_x, limit: 10, after: :column_y`(至少对于 Rails 4) (2认同)

vin*_*odh 112

在rails控制台上使用此命令

rails generate migration add_fieldname_to_tablename fieldname:string
Run Code Online (Sandbox Code Playgroud)

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

运行此迁移

  • 加1,因为我从未设法记住生成迁移的语法... (4认同)

Apo*_*wal 46

有时rails generate migration add_email_to_users email:string会产生这样的迁移

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
  end
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须手动执行以下add_column操作change:

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
  end
end
Run Code Online (Sandbox Code Playgroud)

然后运行 rake db:migrate


Nin*_*inz 23

你也可以

rake db:rollback
Run Code Online (Sandbox Code Playgroud)

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

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

如果您的系统中安装了rails 3.1,那么这将起作用.

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

$rake db:migrate:redo
Run Code Online (Sandbox Code Playgroud)

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


小智 18

要添加列,我只需要按照以下步骤操作:

  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自动擦除表中的所有数据.


Kha*_*bir 9

您还可以使用前列或后列将列添加到特定位置,例如:

rails generate migration add_dob_to_customer dob:date
Run Code Online (Sandbox Code Playgroud)

迁移文件将生成以下代码(除了::email 之后)。您需要在: :email 之后或之前添加: :email

class AddDobToCustomer < ActiveRecord::Migration[5.2]
  def change
    add_column :customers, :dob, :date, after: :email
  end
end
Run Code Online (Sandbox Code Playgroud)


小智 5

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

change_table(:users) do |t|
  t.column :email, :string
end
Run Code Online (Sandbox Code Playgroud)