web-dev-qa-db-ja.com

Rails:移行ファイルを更新してからdb:migrateを実行しましたが、スキーマが更新されていません

テーブルの1つにフィールドを追加しようとしています。

移行ファイル(db\migrateの下)にフィールドを追加してから、問題なく実行された「rakedb:migrate」を実行しました。私のテキストエディタは、schema.dbファイルが更新されており、更新する必要があるとさえ言っていました。

スキーマファイルに新しいフィールドが含まれておらず、ビューからフィールドを参照しようとすると、惨めに失敗します。

どうすればよいですか? Railsを介して、データベースを完全に削除して再作成することなく、追加のフィールドでテーブルを更新することは可能ですか?

21
Evolve

http://guides.rubyonrails.org/migrations.html#changing-existing-migrations

時折、移行を書くときに間違いを犯すでしょう。すでに移行を実行している場合は、移行を編集して再度移行を実行することはできません。Railsはすでに移行を実行していると見なすため、rake db:migrateを実行しても何も実行されません。移行をロールバックし(たとえば、rake db:rollbackを使用)、移行を編集してから、rake db:migrateを実行して修正されたバージョンを実行する必要があります。

38
utapyngo

データベースに何かを追加/変更するときは、常に新しい移行ファイルを作成する必要があります。これが移行の目的です。移行ファイルには、新しい変更を加えて変更を元に戻す機能が必要です。このようにして、問題が発生した場合や気が変わった場合に、以前の移行に簡単にロールバックできます。

「移行の構造」および「移行の記述」というラベルの付いた次のリンクのセクションは、役立つ場合があります。

http://guides.rubyonrails.org/migrations.html

6
jluebbert

私は同じことをしました、私はフィールド名を変更したいと思いました、そしてこれの代わりに:

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日目です...)

4
sarmahdi

私自身の質問を解決しました。

基本的に、scaffoldの実行時に生成された元の移行ファイルを編集するのではなく、達成したい目的のためだけに新しい移行ファイルを作成します。

http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration

4
Evolve

rake db:schema:dumpを実行することで、後の移行でスキーマを再生成できました。

2
lfender6445

これが当てはまるかどうかはわかりませんが、一見の価値があります。 "Railsを使用したアジャイル開発、第3版"から直接

このschema_migrationsテーブルが問題を引き起こす場合があります。たとえば、移行ソースファイルを作成し、ファイルにスキーマ定義ステートメントを追加する前にdb:migrateを実行すると、データベースはそれが更新されたと見なし、スキーマ情報テーブルに新しいバージョン番号が含まれます。
その後、既存の移行ファイルを編集してdb:migrateを再度実行すると、Railsは新しい変更を適用するかどうかわかりません。このような状況では、多くの場合、最も簡単です。データベースを削除して再作成し、移行を再実行します。

0
JRL