web-dev-qa-db-ja.com

Ruby on Rails:既存のデータベースに列を追加する

エラーが発生しています:

SQLite3::SQLException: no such column: ideas.list_id: 
SELECT "ideas".* FROM "ideas"  
WHERE "ideas"."list_id" = 2

しかし、私は追加しました

t.integer :list_id

私のデータベース移行ファイルへ:

class CreateIdeas < ActiveRecord::Migration
  def change
    create_table :ideas do |t|
      t.string :name
      t.text :description
      t.string :picture

      t.timestamps
    end
    add_foreign_key :ideas, :lists
  end
end

これは私にこれを与えました:

class CreateIdeas < ActiveRecord::Migration
  def change
    create_table :ideas do |t|
      t.string :name
      t.text :description
      t.string :picture
      t.integer :list_id
      t.timestamps
    end
    add_foreign_key :ideas, :lists
  end
end

そして、私はタイプしました

rake db:migrate

列がないというエラーが表示される理由は何ですか?私はまだRoRが初めてです。他の方法で列を追加する必要がありますか?

ありがとう

19
hellomello

Speranskyが示唆したように、古い移行ファイルを変更しないでください。むしろ、目的の列を追加する新しい移行を作成する必要があります。たとえば、この場合、アプリで次のコマンドを実行して新しい移行を作成します。

Rails generate migration AddListIdColumnToIdeas list_id:integer

そしてRailsは移行ファイルを自動的に生成し、あとはあとはrake db:migrate

古い移行ファイルの変更を主張する場合は、列を追加して、次を実行できます。

rake db:drop
rake db:create
rake db:migrate

これにより、現在のデータベースが破壊され、新しいデータベースが作成され、すべての移行が実行されます(新しい列が含まれます)。

53
amb110395

既存のデータベースに新しい列を追加する場合は、Rails generate migrationを使用する必要があります。したがって、Rails generate migration add_list_id_to_ideas list_id:integerを試してからrake db:migrateを使用してこの変更をコミットできます。

3
Edgar Wang

古い移行に新しい行を追加しないでください。移行は、データベースを構築するステップです。また、最後に実行された移行の数はschemaに保存され、rake db:migrateを使用する場合は実行もやり直しもされません。以前にテーブルを作成して移行を実行した場合は、add_columnメソッドを使用できる新しい移行を作成する必要があります。

2
Danil Speransky

また、これを行うことができます..

Rails g migration add_column_to_users list_id:string

次にrake db:migrate

ユーザーコントローラーのadd :list_id属性も。

詳細については http://guides.rubyonrails.org/active_record_migrations.html をご覧ください。

1
aaquib

Rails 4.0の簡単な方法単一または複数の列の追加https://Gist.github.com/pyk/8569812

1
Nikhil Thombare

移行ファイルの名前には、名前に日時がエンコードされているため、Railsこの移行を実行し、ロールバックを実行しない限り、再度実行しないでください。

ここに小さなステップでdbを構築する移行の魔法がありますので、rake db:migrateの実行後に移行を更新する必要はありません。dbスキーマに変更を加えるために新しい移行を行う必要があります

そして忘れないで

この移行をロールバックすることにした場合はエラーが発生する可能性があるため、古い移行ファイルから追加された行を削除します

1
abo-elleef

既に移行フォルダーにファイルがある場合は、必要な列を追加するだけで(コードを入力するだけ)、development.sqliteまたはdbファイルを表すものを削除して、rake db:migrateを実行できます。次に、テーブルに新しい列を持つ新しいsqliteファイルを作成し、schema.rbで確認できます。

したがって、基本的に、データベースファイルを削除しなかったことを除いて、あなたがしたことはすべて良いようです。データベース内のすべてのファイルが失われますが、これを行うことは私にとって最も簡単なようです。 Railsアプリをテストおよび開発している場合、これは動作します。このアプローチに何か問題がある場合、私が書いたもの以外にコメントできますか?

編集:私は実際にここでその答えを見つけました 既存の編集Rails移行は良い考えですか?

0
Marko