テーブルの1つにフィールドを追加しようとしています。
移行ファイル(db\migrateの下)にフィールドを追加してから、問題なく実行された「rakedb:migrate」を実行しました。私のテキストエディタは、schema.dbファイルが更新されており、更新する必要があるとさえ言っていました。
スキーマファイルに新しいフィールドが含まれておらず、ビューからフィールドを参照しようとすると、惨めに失敗します。
どうすればよいですか? Railsを介して、データベースを完全に削除して再作成することなく、追加のフィールドでテーブルを更新することは可能ですか?
http://guides.rubyonrails.org/migrations.html#changing-existing-migrations
時折、移行を書くときに間違いを犯すでしょう。すでに移行を実行している場合は、移行を編集して再度移行を実行することはできません。Railsはすでに移行を実行していると見なすため、rake db:migrateを実行しても何も実行されません。移行をロールバックし(たとえば、
rake db:rollback
を使用)、移行を編集してから、rake db:migrate
を実行して修正されたバージョンを実行する必要があります。
データベースに何かを追加/変更するときは、常に新しい移行ファイルを作成する必要があります。これが移行の目的です。移行ファイルには、新しい変更を加えて変更を元に戻す機能が必要です。このようにして、問題が発生した場合や気が変わった場合に、以前の移行に簡単にロールバックできます。
「移行の構造」および「移行の記述」というラベルの付いた次のリンクのセクションは、役立つ場合があります。
私は同じことをしました、私はフィールド名を変更したいと思いました、そしてこれの代わりに:
class CreateComments < ActiveRecord::Migration
def change
create_table :comments do |t|
t.string :commenter
t.text :body
# this line adds an integer column called `article_id`.
t.references :article, index: true
t.timestamps
end
end
end
私が変更され
t.text :body
に
t.text :comment_body
熊手をやってみました
db:migrate
何も起こらなかったので、出力なしでコマンドプロンプトに再び行きました...、私はスタックオーバーフローを見て、 this 私にレーキをするように導きました
db:migrate:redo
アウトプットなし
== 20141129044056 CreateComments: reverting ===================================
-- drop_table(:comments)
-> 0.0000s
== 20141129044056 CreateComments: reverted (0.0886s) ==========================
== 20141129044056 CreateComments: migrating ===================================
-- create_table(:comments)
-> 0.0040s
== 20141129044056 CreateComments: migrated (0.0040s) ==========================
次に、ページ/コントローラーにbodyではなくcommenter_bodyをロードすると、完全にロードされました。
これも同じ解決策だと思います。モデル/ DBの下の動作に問題があるかどうかはわかりません(私はまだRoRに非常に慣れていないので、実際には3日目です...)
私自身の質問を解決しました。
基本的に、scaffoldの実行時に生成された元の移行ファイルを編集するのではなく、達成したい目的のためだけに新しい移行ファイルを作成します。
http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration
rake db:schema:dump
を実行することで、後の移行でスキーマを再生成できました。
これが当てはまるかどうかはわかりませんが、一見の価値があります。 "Railsを使用したアジャイル開発、第3版"から直接
このschema_migrationsテーブルが問題を引き起こす場合があります。たとえば、移行ソースファイルを作成し、ファイルにスキーマ定義ステートメントを追加する前にdb:migrate
を実行すると、データベースはそれが更新されたと見なし、スキーマ情報テーブルに新しいバージョン番号が含まれます。
その後、既存の移行ファイルを編集してdb:migrate
を再度実行すると、Railsは新しい変更を適用するかどうかわかりません。このような状況では、多くの場合、最も簡単です。データベースを削除して再作成し、移行を再実行します。