2012-03-02 15 views
1

私の質問は、SQLiteデータ構造体のカラムの追加、削除、名前の変更、タイプ変更の便利な方法を見つけることです。 、私はRoRの移行ガイドで説明する手順に従った、これまでのところ私は必要なので、すべての時間をruby​​ on railsテーブルにカラムを追加する最良の方法

<%= form_for(@Product, :html => {:name => "product_name", :id => "product_id"}) do |form| %> 
    <div class="field"> 
     <%= form.flag "Input 1" %> 
     <%= form.text_field :Input_1 %> 
     <%= form.flag "Input 2" %> 
     <%= form.text_field :Input_2 %> 
     ..., etc. 
    </div> 
<% end %> 

私は(簡体字)以下のような複数の入力テキストフィールドを持っているのRuby on Railsのフォームを持っています新しいテキストフィールドを追加し、入力nが、私はこの

rails generate migration AddInputToProducts Input_n:string 

のように、それの移行を生成し、私は、マイグレーションを実行したと言う

rake db:migrate 

この手順の問題点は、マイグレーションが生成されて実行されると、マイレージに使用した正確な名前(この例ではInput_n)のトレースがなくなり、それを永遠にそこにとどめてください。その結果、私のテーブルには複数のエントリがあり、使用すると思って作成しましたが、実際にはそれらのテーブルは必要ありません。正確な名前は記憶されていません。削除、再利用、名前変更、タイプを変更してください。

私の質問は2つあり:

  1. はガイドで説明したようにマイグレーションを実行するよりもより実用的になり、既存のテーブルに列を追加するために、より良く、より便利な方法はありますか?
  2. データ構造内の既存の列のタイプを一覧表示、削除、名前変更、または変更するにはどうすればよいですか?
+2

これらの列に適切な名前を付けるのはどうでしょうか?また、マイグレーションは元に戻すことができます。彼らは 'down'メソッドを持っています。 –

+0

@ NiklasB。既にコミットされている場合を除いて、新しい(逆の)移行を作成する必要があります。 –

+0

@Andrew:はい、私はそれについて考えませんでした。 –

答えて

0

dbフォルダを見ると、列の名前を含むテーブルに関するすべての情報を持つschema.rbという名前のファイルがあります。リストがあります。

マイグレーションの名前を変更するなど、マイグレーションは完璧ですが、Mysql Queryブラウザ(MySQLを使用していることが許されています)のような他のツールの使用を止めるものはありません。

+0

迅速な対応のためにHenrikに感謝します。私は2つのテーブルのファイルを見て、 "#テーブル"プレイリストをダンプできませんでした "のようなエラーがあります。 #列 'SongList'のための 'select_field'が不明です" – rh4games

0

ツールを使用して移行したくない場合は、使用するデータベース(SQLite)のGUIを使用できます。変更するだけで済みます。

+0

提案のためのstormlifterありがとうございます。あなたが使用できるGUI swをお勧めできますか? – rh4games

+0

ご使用のOSによって異なります。しかし、私は使用しています:http://sqlitebrowser.sourceforge.net/ – stormlifter

0

マイグレーションを生成するたびに、必要に応じて検査および調整できる関連ファイルdb/migrateが作成されます。規約の問題として、通常適用されている移行を変更することは悪い形です。変更が必要な場合は、rake db:migrate:down VERSION=nnnnnnはバージョンシリアル)のマシンに適用されている場合はマイグレーションを解除するか、最初のマイグレーションを元に戻す2回目のマイグレーションを作成するか、

開発とデプロイメントの環境が複雑になればなるほど、マイグレーションの管理がより慎重になる必要があります。

データを気にしない場合は、いつでもrake db:migrate:resetからビルドすることができます。私は、データベース構造を微調整する際に、開発の初期段階でこれを頻繁に行います。私はそれを働かせたら、私はそれをコミットし、その時点からそれを変更するために追加の移行を行います。 resetはデータベースを効果的に削除して再作成するため、本番環境でこれを実行しないでください。

+0

助けてくれてありがとうタドマン。これは、作成したすべての移行を記録しておくことを意味しますか?私のプロジェクトでは、私は追加し続けて、新しい列とマイグレーション名はそれらが何を含んでいるかについて明示的ではないので、私はそれらをコミットした後に時々マイグレーションファイルを削除するので、私の質問 – rh4games

+1

マイグレーションは、移行のポイントは、現在のスキーマにどのように到達したかを完全に記録することです。つまり、移行を含むソースベース以外のものから始めて、空のデータベースから移行を使用して現在のスキーマにステップバイステップで移行できるはずです。 – tadman

+1

同じデータベースの複数のインスタンスを操作する場合は、移行が特に重要になります。移行は、特定の方法でスキーマを修正するためのパッチとして機能するため、他のデータベースを簡単に使用することができます。ほとんどのアプリケーションには、少なくとも1つ以上の開発データベースと1つの本番データベースがあります。プレビューとテストの目的で、中間段階または2段階にすることがよくあります。これらのすべてを移行を使用してバージョン管理する必要があります。 – tadman