23

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

移行ファイル (db\migrate の下) にフィールドを追加し、'rake db:migrate' を実行しましたが、問題なく実行されました。私のテキスト エディターは、schema.db ファイルが更新されたため、更新する必要があることを教えてくれました。

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

どうすればいいですか?データベースを完全に削除して再作成しなくても、レールを介して追加のフィールドでテーブルを更新できますか?

4

7 に答える 7

44

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

Occasionally you will make a mistake when writing a migration. If you have already run the migration then you cannot just edit the migration and run the migration again: Rails thinks it has already run the migration and so will do nothing when you run rake db:migrate. You must rollback the migration (for example with rake db:rollback), edit your migration and then run rake db:migrate to run the corrected version.

于 2012-05-26T16:22:03.290 に答える
7

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

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

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

于 2009-09-13T03:28:24.227 に答える
5

私は同じことをしました。フィールド名を変更したかったのですが、これの代わりに:

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

出力なしで再びコマンドプロンプトに移動したため、何も起こりませんでした...、私はスタックオーバーフローを見て、これがレーキを行うように導きました

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

于 2014-11-29T07:05:04.243 に答える
4

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

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

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

于 2009-09-13T01:57:51.150 に答える
2

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

于 2014-03-19T19:43:39.800 に答える
0

これが当てはまるかどうかはわかりませんが、試してみる価値はあります。「Rails を使用したアジャイル開発、第 3 版」からそのまま:

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

于 2009-09-13T01:33:53.507 に答える
0

rake db:migrate を実行すると、そのファイルに列を追加できなくなります。その特定の列を追加するには、rails g migration add_columnname_to_tablename を使用して新しい移行ファイルを生成し、rake db:migrate を実行する必要があります。

于 2011-07-24T11:57:40.270 に答える