Ruby on rails 3 在Rails迁移中向现有表添加列

Ruby on rails 3 在Rails迁移中向现有表添加列,ruby-on-rails-3,Ruby On Rails 3,我有一个用户模型,它需要一个:email列(我忘了在最初的scaffold中添加该列) 我打开迁移文件并添加了t.string:email,做了rake db:migrate,得到了一个NoMethodError。然后我加了一行 add_column :users, :email, :string 再次rakedb:migrate,再次NoMethodError。我在这里漏了一步吗 编辑:这是迁移文件 class CreateUsers < ActiveRecord::Migration

我有一个用户模型,它需要一个
:email
列(我忘了在最初的scaffold中添加该列)

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

add_column :users, :email, :string
再次
rakedb: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
class CreateUsers
完成此操作后,我创建了一个新的迁移,而不是篡改原始迁移,只在向上部分使用add列,在向下部分使用drop列

您可以更改原始文件,如果在这两个文件之间向下迁移,则可以重新运行它,但在这种情况下,我认为这会导致无法正常工作的迁移

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


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

如果您已经运行了原始迁移(在编辑之前),则需要生成新迁移(
rails generate migration add\u email\u to\u users email:string
即可)。 它将创建一个迁移文件,其中包含以下行:
添加列:用户、电子邮件、字符串
然后执行
rakedb:migrate
,它将运行新的迁移,创建新列

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

您也可以这样做

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

rake db:migrate
如果您的系统中安装了rails 3.1以后的版本,这将起作用

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


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

在rails控制台上使用此命令

rails generate migration add_fieldname_to_tablename fieldname:string


要运行此迁移

要添加列,我只需执行以下步骤:

  • rails生成迁移将\u fieldname\u添加到\u tablename fieldname:string

    备选方案

    rails生成迁移addFieldnameToTablename

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

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

    rails生成迁移addemailtouser

  • rakedb:migrate

  • 您可以从
    db/schema.rb
    中更改架构,在SQL查询中添加所需的列
  • 运行以下命令:
    rakedb:schema:load

    警告/注意

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


  • 您可以通过以下方式回滚上一次迁移:

    rake db:rollback STEP=1
    
    或者通过以下方式回滚此特定的迁移

    rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>
    
    rakedb:migrate:down版本=
    
    编辑文件,然后再次运行rake db:mirgate。

    您也可以这样做。。 rails g迁移将列添加到用户电子邮件:string

    然后rakedb:migrate 同时在用户控制器中添加:email属性


    有关更多详细信息,请查看如果表已存在,还可以使用
    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\u email\u to\u users email:string
    生成如下迁移

    class AddEmailToUsers < ActiveRecord::Migration[5.0]
      def change
      end
    end
    
    然后运行
    rake db:migrate

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

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

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

    rails generate migration add_dob_to_customer dob:date
    
    迁移文件将生成以下代码,但after::email除外。您需要在::email之后或之前添加::email

    class AddDobToCustomer < ActiveRecord::Migration[5.2]
      def change
        add_column :customers, :dob, :date, after: :email
      end
    end
    
    class AddDobToCustomer
    为了清楚起见,我们使用复数?所以它是
    向用户添加电子邮件
    ,而不是
    向用户添加电子邮件
    ?正确。Rails中的表名始终为复数(以符合DB约定)。最后一步还可以使用
    Rails DB:migrate
    。是否可以在表中的特定位置创建新列。例如,如果我想在现有“email”字段之后创建新字段“status”?@neeraj您现在可能已经有了答案,但对于其他搜索者,您可以这样做,例如
    t.string:column_x,limit:10,after::column_y
    (至少对于Rails 4),我这样做了,但它没有重做“脚手架”并添加新列。我怎样才能“自动地”做到这一点呢?@John Wooten,你可能想删除脚手架,然后再检查一遍。也要删除相应的迁移。要添加注释:在不更改迁移的情况下更改架构可能会与维护应用程序的其他开发人员产生问题。1)rails是否应生成迁移添加电子邮件到用户电子邮件:string
    此操作应在
    bu之后运行
    
    change_table(:users) do |t|
      t.column :email, :string
    end
    
    rails generate migration add_dob_to_customer dob:date
    
    class AddDobToCustomer < ActiveRecord::Migration[5.2]
      def change
        add_column :customers, :dob, :date, after: :email
      end
    end