15

私はばかです... Railsでの移行を台無しにしました:

移行がモデルジェネレーターのように機能すると考えて( を使用references:modelname)、次のことを行いました。

$ rails g migration add_event_to_photos references:event

移行を作成した

class AddEventToPhotos < ActiveRecord::Migration
  def change
    add_column :photos, :references, :event
  end
end

そして今、私の開発データベース ( SQLite3 ) には、テーブルreferencesに type の列があります。eventphotos

私のschema.rbには、真ん中に次のような行があります。

# Could not dump table "photos" because of following StandardError
#   Unknown type 'event' for column 'references'

rake db:rollbackこれに対して無力です:

$ rake db:rollback
==  AddEventToPhotos: reverting ===============================================
-- remove_column("photos", :references)
rake aborted!
An error has occurred, this and all later migrations canceled:

undefined method `to_sym' for nil:NilClass

では、開発データをデータベースにロールバックして維持するにはどうすればよいでしょうか? それが私の唯一の選択肢である場合は、写真テーブルをゴミ箱に捨てることさえできます..しかし、すべてを再構築する必要はありません. 何をすべきか?


ところで、これを読んで同じ愚かな間違いを犯そうとしている人のために...しないでください!正しい移行ジェネレーターを使用します。

$ rails g migration add_event_to_photos event_id:integer
4

5 に答える 5

6

これを行う最も簡単な方法は、.xml の schema.rb ファイルでテーブルを再作成することでした/db/。その後、実行しましたrake db:reset(保留中の移行があると表示された場合は、それらを削除して再試行してください)。

これで問題は解決しました。

于 2012-08-30T12:26:30.287 に答える
3

でデータベースに入ります./script/rails dbconsole。次に、次のコマンドを入力します。

.output dump.sql
.dump

このファイルdump.sqlには、データベースを再作成してデータを追加するために使用する SQL コマンドが含まれています。お気に入りのエディター ( vim;-) などで編集して、列の種類を削除または修正するだけです。schema_migrations無効な移行 ID をテーブルから削除することもできます。データベースをドロップし(db/development.sqliteファイルの名前を変更することをお勧めします)、新しいデータベースを作成し、ダンプファイルをそこに読み込みます( command を使用.read dump.sql)。

あとは、マイグレーションを修正して実行するだけです。

于 2011-08-10T23:33:11.537 に答える
2

空のdownメソッドを追加し、rake db:rollbackを実行します

新しい移行構文であるahhを編集すると、本文を次のように置き換えることができます。

def self.down; end

これは古い構文です。または、本文を完全に削除して(これを試していません)、実行します。rake db:rollback

于 2011-08-10T22:16:57.383 に答える
1

単なるアイデアですが、おそらく古いバージョンのスキーマに戻してロードできるのは SQLite 固有のものではないことはわかっています。そこからやり直してみては?GIT で特定のファイルを元に戻す (チェックアウトする) ことができます。そして、def self.down; end別のポスターで提案されたように、実行します。

于 2011-12-23T03:37:23.900 に答える
0

問題が発生するのは、SQLite が指定した型でスキーマを作成する間 (この場合event、その型を ActiveRecord にダンプできないためです。

sqlite_master ファイルを編集し、 create table string ( sql) を正しいものに変更する必要があります。

その文字列を台無しにするとテーブルが壊れてしまうので、最初にテーブルをバックアップすることをお勧めします。

ここに関連するレールの問題があります

于 2012-01-03T18:42:34.017 に答える