0

私は、現在のプロジェクトでかなり急なリファクタリングを行っている最中です。この岐路にたどり着く前に、2 つのモデルが実際には同じモデルであることに気づきましたが、異なる状態にあり、システムをそのように表現したいと考えています。その結果、すぐに廃止されるモデルのすべてのオブジェクトを取得し、それらを他のモデルに移動して、新しいステータス列を正しく設定する必要があります。特にモデルが非常に似ているため、問題はコード的に単純です。

私にとっての問題点は、両方向への移行の中間点でこれらの変更を行わなければならないことです。ここからそこまでの道のりは次のようになります。

add_column :model_ones, :status, :string

make_all_model_two_records_into_model_one_records()

drop_table :model_twos

明らかに、他の方向も簡単に定義できます

create_table :model_twos do |t|
  ...
end

move_model_ones_with_status_x_into_model_twos_table

remove_column :model_ones, :status

これは良いことですが、レポから ModelTwo.rb を削除するという魔法の瞬間に到達すると、すべてが無駄になります。その時点で、そのソースを読まずにゼロから移行することはできません。それに対する私の反応は、データを前後に移動するためにまっすぐなSQLを書くか、そのデータ変換を移行から除外することです。抜いたら一体どこへ?移行時に適切なタイミングで確実に移行するにはどうすればよいですか?

そして、私が問題のその側面を克服し、ゼロから現在まで幸せに移行できるようになったとしましょう. 下に移行することはできませんよね?これは、段階的な移行の概念が私にとって単に死んでいる瞬間を表しているのでしょうか?

以前の移行に戻って、ModelTwo がまったく存在しなかったことを世界に納得させることができると思います。

この種の Rails のリファクタリングは、すでにどこかで行われているはずです。それは実行可能でなければなりませんよね?私はそれを行う方法を理解できません。

前もって感謝します、jd

4

1 に答える 1

1

私は...するだろう:

  1. ステータス列を追加する移行を作成する

  2. rake タスクを実行してデータを移動します

  3. 正しく移動されたすべてのデータをテストする

  4. 不要な古いテーブルを削除するために別の移行を実行します。

開発環境を簡単に構築できるようにするために、古い移行を変更する必要がある場合があります。どうしてそんな問題だと思うのかわからない。移行はあなたを助けるためにあります。従う義務があると感じる魔法のルールではありません。

場合によっては、ベスト プラクティスにこだわりすぎて、あらゆる状況に適用できる "ベスト プラクティス ルール" を設定するのは非常に難しいことを忘れてしまうことがあります。これらはガイドとしては優れていますが、最終的にベスト プラクティスは、プロジェクトに最適な方法を実行することです。

于 2012-09-08T04:14:37.130 に答える