2011-01-03 11 views
0

マイグレーションによってマイデータベース内のプロパティという名前のテーブルに新しい列がデフォルトで追加されました。新しく追加された列をRailsに移入する

class AddDefaultToProperty < ActiveRecord::Migration 
    def self.up 
    add_column :property, :is_default, :boolean 
    end 

    def self.down 
    remove_column :property, :is_default 
    end 
end 

デフォルト列はプロパティがデフォルト1であるかどうかと言うブール値が含まれています。今私はいくつかの特定の行のためにその列を設定する方法が必要です。この作業を行う最善の方法はどれですか?近い将来、デフォルトのプロパティが変更されるため、この状況を考慮するには柔軟な方法が必要です。

使用して、レール2.3.10

ありがとう!

答えて

2

それが移行の不可欠な部分であり、移行が完了した直後にそのデータを使用できるようにするには、そのスクリプトを移行に直接入れる必要があります。データの可用性を待つことができる場合は、データを移入するためのrakeタスクを作成することもできます。これは、移行が速く、rakeタスクがオプションであることです。欠点は、手動で実行する必要があることです。

+0

はい、データの可用性を待つことができます。私は第二の選択肢がより適していると思う。しかし、どうしたらいいですか?私が思った簡単な解決策は、デフォルトとして設定する必要があるすべての行を見つけ出し、列を1で更新することでした。 – flyer88

+1

最も速い方法は、MySQLコマンドを使用することです。更新は、その情報をレールに戻すのではなく、サーバー上で行われるからです。たとえば、次のSQLを実行するRakeタスクを作成できます。 "UPDATEプロパティSET is_default = 1 WHERE some_attribute = true AND some_other_attribute = false"これがオプションでない場合、Rubyループを作成して各レコードを更新することができます。 –

0

マイグレーション時にデータを変更することをお勧めします。これにより、今後の移行が常に期待どおりに機能するようになります。

ただし、マイグレーションで使用する独自のモデルを作成してください。そうしないと、新しいモデルと古いスキーマとの間のコンフリクトが発生します。

ただ、この行をあなたの移行のトップを追加します。

class Property < ActiveRecord::Base; end 
+0

マイグレーション内で "reset_column_information"コマンド(Property.reset_column_information)を使用すると、新しいモデルや古いスキーマの問題を回避できます。これにより、スキーマ情報が使用可能な最新のスキーマにリセットされ、各モデルをサンク・パッチする必要がなくなります。 –

+0

@pan私は、存在しない列などのバリデーションのようなことについてもっと話していました。それは有効な点ですが。 – thomasfedb

関連する問題