2009-04-15 11 views
11

私は、ActiveRecordの移行に関する話、アプリケーション内でデータを変更するために使用する必要があるかどうかについて話をしました。私の質問は、あなたがこれを行うためにマイグレーションを使用していない場合、あなたは何を使用していますか?あなたが書いた別のスクリプト?Rails App Dataをどのように変更しますか?

私は別の方法についての提案を受けており、なぜ単に移行を使用するよりも良いアイデアかもしれません。あなたは、データベースをセットアップするための基礎としてschema.rb使用して

rake db:reset 

rake db:schema:load 

タスクを、使用している場合

答えて

14

一つの問題が来ます。したがって、データはロードされず、あなたは立ち往生していません。あなたが取得する必要Agile Web Development with Rails, Third Edition

、(?Rubyの本は、「つるはし」の本であれば、これはところで、「ハンモック」の本でなければなりません)あなたはまだ行っていない場合は、DHH氏は述べています:

...マイグレーションは実際には キャリーシードデータではありません。彼らは確かにそれを行うにはあまりにも時間的に です。 スキーマの1つのバージョンから次のスキーマへの移行には、 スクラッチからフレッシュなスキーマを作成しないようにするための移行があります。これにはdb/schema.rbファイル があります。

だから、できるだけ早くあなたが実際に 実際のアプリケーションと一緒に行くにつれ、 人々は、彼らが アプリケーションを設定するとき、あなたの早期 移行を実行しているではありません。 db/schema.rbに格納されているバージョンは から始まり、すべて前のマイグレーション は無視されます。これは、 移行によって作成されたデータが データベースに決して作成されないことを意味します。したがって、 には依存できません。

多くの代替方法があります 永続的な種子データです。最も簡単なのは です。 db/seed.rbに新しいファイルを作成することになります。このファイルには、 Product.cを呼び出して、 の設定を行う呼び出しを作成します。このファイルはrake db:schema:loadの後に と呼ばれ、 初期スキーマが作成されます。

+1

実際には、 'rake db:reset'も' rake db:seed'を実行します。そのため、シードファイル内のデータはすべて読み込まれます。 – lobati

4

多くの場合、移行が最適であり、別のスクリプトで置き換えることはできません。次のシナリオを考えてみましょう。アプリケーションはライブデータで既に使用されています。コード列には "name-zip_code"という形式のコードが含まれています(醜いことは知っていますが、それは起こります)。そして、それを 'name'と 'zip_code'の2つの列に分割し、 「コード」列に表示されます。


def self.up 
    add_column :companies, :zip_code, :integer 
    add_column :companies, :name, :string 
    Company.reset_column_information 
    Company.find(:all).each do |company| 
    name, zip_code = company.code.split('-') 
    company.update_attributes(:name => name, :zip_code => zip_code) 
    end 
    remove_column :companies, :code 
end 

この場合、データが名前と郵便番号の列に転送される前にコード列を削除することはできません。

1

データベースでデータを変更する必要がある場合、作業を実行するライブラリ関数を実行するRakeタスクを作成します。このように、データ操作は繰り返し可能で、必要に応じて移行からも実行できます。

関連する問題