私は:email
カラムを必要とするUsersモデルを持っています(最初の足場でそのカラムを追加するのを忘れていました)。
私は移行ファイルを開いて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
元の移行を(編集前に)既に実行している場合は、新しい移行を生成する必要があります(Rails generate migration add_email_to_users email:string
がうまくいきます)。その後、rake db:migrate
を実行すると、新しい移行が実行されます。
元の移行をまだ実行していない場合は、編集しようとしているように、単にそれを編集できます。あなたの移行コードは ほぼ 完璧です:あなたはadd_column
行を完全に削除する必要があります(そのコードはテーブルが作成される前にテーブルに列を追加しようとしていますとにかくt.string :email
を含めてください。
Railsコンソールでこのコマンドを使う
Rails generate migration add_fieldname_to_tablename fieldname:string
そして
rake db:migrate
この移行を実行する
時々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
を実行します
またすることができます
rake db:rollback
テーブルにデータを追加していない場合は、email列を追加して移行ファイルを編集してから、
rake db:migrate
あなたのシステムにRails 3.1以降がインストールされていればこれはうまくいきます。
変更を行うより簡単な方法は、移行ファイルの変更をそのままにすることです。つかいます
$rake db:migrate:redo
これにより、最後の移行がロールバックされ、再度移行されます。
列を追加するには、次の手順に従ってください。
Rails generate migration add_fieldname_to_tablename fieldname:string
代替
Rails generate migration addFieldnameToTablename
マイグレーションが生成されたら、マイグレーションを編集して、その列に追加したいすべての属性を定義します。
注 :Railsのテーブル名は常に複数形です(DBの規約に合わせるため)。 前述のいずれかの手順を使用した例 -
Rails generate migration addEmailToUsers
rake db:migrate
または
db/schema.rb
から変更できます。SQLクエリに必要な列を追加します。このコマンドを実行して下さい:rake db:schema:load
警告/注意
rake db:schema:load
を実行すると、テーブル内のすべてのデータが自動的に消去されることに注意してください。
元の移行をいじるのではなく、これを実行したときに、upセクションのadd列とdownセクションのdrop列だけを使用して新しい移行を作成します。
元のものを変更して、その間を移行した場合は再実行できますが、この場合は、正しく機能しない移行になったと思います。
現在投稿されているとおり、列を追加してからテーブルを作成しています。
順番を変えてもうまくいくかもしれません。または、既存の移行を変更しているときは、別の追加列を追加するのではなく、作成テーブルに追加するだけです。
テーブルがすでに存在する場合は、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
最後の移行をロールバックすることができます。
rake db:rollback STEP=1
またはこのロールバック 特定 /による移行
rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>
ファイルを編集してからrake db:mirgate
を再度実行します。
これを行うこともできます。Rails g migration add_column_to_users email:string
それからレーキdb:migrateあなたのユーザコントローラに:email属性も追加してください。
詳細はチェックアウト http://guides.rubyonrails.org/active_record_migrations.html