web-dev-qa-db-ja.com

Railsマイグレーションで既存のテーブルに列を追加する

私は:emailカラムを必要とするUsersモデルを持っています(最初の足場でそのカラムを追加するのを忘れていました)。

私は移行ファイルを開いてt.string :emailを追加し、rake db:migrateを行い、そしてNoMethodErrorを得ました。それから私はラインを追加しました

add_column :users, :email, :string

またrake db:migrateNoMethodError。私はここで一歩足りないか?

編集:これは移行ファイルです。

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
289
John

元の移行を(編集前に)既に実行している場合は、新しい移行を生成する必要があります(Rails generate migration add_email_to_users email:stringがうまくいきます)。その後、rake db:migrateを実行すると、新しい移行が実行されます。

元の移行をまだ実行していない場合は、編集しようとしているように、単にそれを編集できます。あなたの移行コードは ほぼ 完璧です:あなたはadd_column行を完全に削除する必要があります(そのコードはテーブルが作成される前にテーブルに列を追加しようとしていますとにかくt.string :emailを含めてください。

506
Dylan Markow

Railsコンソールでこのコマンドを使う

Rails generate migration add_fieldname_to_tablename fieldname:string

そして

rake db:migrate

この移行を実行する

99
vinodh

時々Rails generate migration add_email_to_users email:stringはこのような移行を生み出します

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

その場合、手動で add_columnchangeにする必要があります。

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

そしてrake db:migrateを実行します

26
Apoorv Agarwal

またすることができます

rake db:rollback

テーブルにデータを追加していない場合は、email列を追加して移行ファイルを編集してから、

rake db:migrate

あなたのシステムにRails 3.1以降がインストールされていればこれはうまくいきます。

変更を行うより簡単な方法は、移行ファイルの変更をそのままにすることです。つかいます

$rake db:migrate:redo

これにより、最後の移行がロールバックされ、再度移行されます。

22
Ninz

列を追加するには、次の手順に従ってください。

  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を実行すると、テーブル内のすべてのデータが自動的に消去されることに注意してください。

18
Pratik Naik

元の移行をいじるのではなく、これを実行したときに、upセクションのadd列とdownセクションのdrop列だけを使用して新しい移行を作成します。

元のものを変更して、その間を移行した場合は再実行できますが、この場合は、正しく機能しない移行になったと思います。

現在投稿されているとおり、列を追加してからテーブルを作成しています。

順番を変えてもうまくいくかもしれません。または、既存の移行を変更しているときは、別の追加列を追加するのではなく、作成テーブルに追加するだけです。

3
Don Roby

テーブルがすでに存在する場合は、force: trueを使用してtable内のカラムを強制的にテーブル化することもできます。

example

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
Aravin

最後の移行をロールバックすることができます。

rake db:rollback STEP=1

またはこのロールバック 特定 /による移行

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

ファイルを編集してからrake db:mirgateを再度実行します。

0
fangxing

これを行うこともできます。Rails g migration add_column_to_users email:string

それからレーキdb:migrateあなたのユーザコントローラに:email属性も追加してください。

詳細はチェックアウト http://guides.rubyonrails.org/active_record_migrations.html

0
aaquib