0

だから私はルビープロジェクトを始めたばかりで、レールにはまったく慣れていません。アプリで 2 つのモデルを作成したいと考えています。Words(「自転車」など) およびWordtypes(「名詞」など)。まず、足場を使用して Word モデルを生成します。

  $ rails g scaffold Word word_name:string word_type_name:string
  $ rake db:migrate 

次に、単語型参照を含む別のデータベースと通信できるように、a を使用しない方がよい場合と、代わりにword_type_namea を使用する方がよい場合があることを思い出します。word_type_id.

だから私は実行します:

  $ rails destroy scaffold Word
  $ rake db:migrate 

そして、すべてを新たに作成します。

  $ rails g scaffold Word word_type_id:integer word_id:integer word_name:string
  $ rake db:migrate 

すべてがうまくいったかどうかを確認したいので、Rails コンソールを実行します。

  $ rails console
  Loading development environment (Rails 3.2.11)
  >> Word
  => Word(id: integer, word_name: string, word_type: string, created_at: datetime, updated_at: datetime)

なぜ旧モデルがここにあるのですか?過去の何かを元に戻すのを忘れましたか?

編集/更新

もう少し読んだところ、データベースをリセットするのを忘れていたようです。だから今私は使用します:

$ rake db:reset 

欠点は、すべてを移行しようとすると、このエラーが発生することです。

  $ rake db:migrate
  ==  CreateWords: migrating ====================================================
  -- create_table(:words)
  rake aborted!
  An error has occurred, this and all later migrations canceled:

  SQLite3::SQLException: table "words" already exists: CREATE TABLE "words" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "word_type_id" integer, "word_id" integer, "word_name" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) /Library/Ruby/Gems/1.8/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in `initialize'

すべての古いテーブルを削除する必要があるいくつかのドキュメント ( http://guides.rubyonrails.org/migrations.html#resetting-the-database )を読みましたが。rake db:resetここで何が起こっているか知っている人はいますか?

4

3 に答える 3

2

通常の流れ

rails g scaffold Word word_name:string word_type_name:string

コントローラー、ビュー、モデル、移行ファイルを作成します

rake db:migrate 

これは、db/migrate/ 内のファイルの ruby​​ コードを実行し、それに応じてデータベースをセットアップする rake タスクです。あなたの場合、これにより、列とを持つwordsテーブルが作成されます。word_nameword_type

ここで、足場で間違いを犯したことに気付いたら、まずデータベースの状態を元に戻す必要があります。だから、走って

 rake db:rollback

これにより、最後の移行が取り消されます。この場合、移行wordsによって列を含むテーブルが作成されます。次に、すべての足場ファイルを完全に削除できます

rails destroy scaffold Word

これにより、すべてのファイル (ビュー、モデル、移行) が破棄されます。

次に、新しい足場を進めることができます。

 $ rails g scaffold Word word_type_id:integer word_id:integer word_name:string
 $ rake db:migrate 

あなたの州で

あなたの編集では、コマンドを使用しました

  rake db:reset

これは、データベース内の値のみをリセットします。つまり、次のような値がある場合

DB

  Words

 id name type

 1) Bike, noun

 2) Car, noun 

rake db:resetこのようにデータベース内のすべての値をリセットします

DB

 Words

id name type

rake db:rollback実際に必要なのは、列を破棄することです。それを作成した移行ファイルがある場合は、最後の移行、移行ファイルを探してアクションを元に戻すことを簡単に実行できます。

プロジェクトを開始したばかりであるべきだと思うので、コマンドを使用してデータベースを削除するだけで、rake db:dropすべてのテーブルが破棄されます。

DB

  empty

次にrake db:migrate、すべての移行を実行する実行します

于 2013-08-24T14:16:10.480 に答える
2

ここでの問題は、足場の Word を破棄したが、移行を元に戻していないため、古いテーブルがデータベースに既に作成されており、削除されていないことです。

これで、足場が再び生成されました。しかし、words という名前のテーブルが既に存在するため、彼の新しいスキャフォールドの移行は実行できません。

スキャフォールドの破棄中にテーブル ワードが削除されたため、移行を使用してテーブル ワードを削除することはできません。

すべてのデータを失うことを恐れない場合は、次を実行できます。

bundle exec rake db:drop db:create db:migrate

新しい変更でデータベースを再度セットアップします。

または、他のテーブルのデータを失いたくない場合は、別の方法で、

プロジェクト ディレクトリからターミナルでデータベース コンソールを使用して、データベースからテーブルを削除します。

rails dbconsole
>> drop table words;
>> exit

bundle exec rake db:migrate
于 2013-08-24T14:14:12.377 に答える