2013-03-22 11 views
5

マイグレーション中に実行される独自のタイムスタンプメソッドを作成しようとしています。その場にあるものが、フィールドにNOT_NULL制約を追加するようになりました。私は本当にそれを望んでいません。Rails/Rubyマイグレーション方法のタイムスタンプをオーバーライドするには

私が持っている問題は、私は複数のスキーマデータベースを持っているということです。各主要クライアントが独自のスキーマを取得する場所。新しいクライアントをオンボードにすると、新しいテナントレコードが作成され、新しく作成されたスキーマの移行が実行されます。

新しいスキーマは、もちろんデータがないことを除いて、他のスキーマのテーブルの正確なコピーとみなされます。

私が最後に行った移行は、少し古いバージョンのレールを使用していました。まだ3歳ではあるが、年を取っている。タイムスタンプを作成したとき、それらはNULL可能でした。私は(新しいレール上)先日の移行を実行したとき は...まあ、すべてのフィールドは今NOT_NULL

私はレコードが更新されたときupdated_atのが唯一の移入されたアイデアで開発されたコードを持っています...それが作成されたときではありません。 (サードパーティのアプリケーションとデータベースの "関数"がレコードを作成する).. レコードを作成するサードパーティ製のアプリケーションとデータベース関数は、新しいスキーマに落ちています... すべてのNOT_NULL制約をすべて削除しましたテーブルを手動で作成しましたが、私はマイグレーションタスクにクリーンアップを書いて、将来のすべてのテーブルが修正されるようにする必要はありません。

私は、タイムスタンプのメソッドをオーバーライドすることを考えました変更され、既存のコードを破らなかったものに戻ります。

私は、元に戻す/上書きする必要がある理由があります。
私の質問は今...どのように私はメソッドをオーバーライドするのですか?

create_table :foo do |t| 
    t.text :bar 
    t.datetime :created_at 
    t.datetime :updated_at 
end 

答えて

4

これを猿のパッチに入れて...簡単に!

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition 
    def timestamps(*args) 
    options = args.extract_options! 
    column(:created_at, :datetime, options) 
    column(:updated_at, :datetime, options) 
    end 
end 

マニエク氏によると、この "修正"のため、レールの更新は無視されます。

しかし、彼の最初の提供は同じです。また、彼の修正に対応するために、古い移行を経て "タイムスタンプ"を新しいコードに置き換える必要があります。それに加えて、今後自動生成されるすべてのマイグレーションを置き換えなければならないことも付け加えてください。

私はDRYにうまく合っているとは思っていません。それはSPOTにも適合しません。

Just B carefulllll!

1

の何が問題なのです。私はそれを明確にクラスパスを見ることができないと私はそれを上書きするかどうかは正確にはわかりませんか?

+0

私は既に50以上の移行を行っています。私はそれらをすべてこのパラダイムに変えていきたいと思いません。私はまた、タイムスタンプの代わりに壊れたdatetimeを配置するように、足場を作成するレールのコードを変更する必要はありません。 – baash05

+3

@daveatflowで移行を変更すると、必ず質問を入力するよりも時間がかかります:)どこで上書きするか:確実にデバッグを有効にしてレーキタスクを実行できますか? create_tableブロック内に 'debugger'呼び出しを置き、タイムスタンプ・メソッドにステップします。ファイルの場所を取得する必要があります。私は個人的にはこれをお勧めしません。これは将来のレールバージョンでも変更される可能性があるためです。 – maniek

+0

まあ、私は50以上のマイグレーションがあると言いました。私はそれらをすべて変更しなければならず、将来のマイグレーションはすべてレールによって生成されます。また、他の人が作成した移行レールを変更しなければならないことを文書化する必要があります。デバッガのロジックは...今はそれが賢明です。将来のバージョンでの変更。私は特にそれを避けようとしています。フィールド名を変更すると(たとえば)、1つのデータベース、2つのスキーマが同一である必要がありますが、フィールド名は異なります。 – baash05

関連する問題