7

ActiveRecord でアプリケーションを実行中にテーブルから列を削除すると、ActiveRecord が列名をキャッシュするため、エラーが発生します。

ActiveRecord の他のバージョンの回避策は、モデルの #columns メソッドをオーバーライドし、移行前に非推奨の列名を除外することです (基本的に、これらの列を AR から非表示にします)。これは、列名に関連するすべてのメソッドが #columns 呼び出しに基づいていたため機能しました

ActiveRecord 3.1 では、テーブル構造のキャッシングが ConnectionPool に移動され、すべての列名関連の値 (例: coluumns_hash) が個別にキャッシュされます (3.2 では ModelSchema.columns を使用して、これが再び機能するようにしました)。

ActiveRecord 3.1 で安全な列ドロップを実現する方法はありますか?

4

2 に答える 2

3

TST Media の Luke Ludwig は、ここで解決策を提供しています。基本的に、それらは「列が削除されるクラスの ActiveRecord::Base.columns メソッドをオーバーライドします」。

(3.1 以外のすべてに適用可能な解決策)

于 2012-09-21T09:46:47.380 に答える
1

複数のアプリケーションサーバーがあり、ダウンタイムなしで一度に1つを停止できる場合は、次のように機能します。

  1. 削除する列をユーザーが変更する機能を削除します。
  2. アプリケーションを一度に1つずつ再起動します。
  3. 既存のデータベースのマスターマスターである新しいデータベースを起動します。
  4. 新しいデータベースからのレプリケーションを停止します。
  5. 新しいデータベースサーバーに列をドロップします。
  6. 新しいデータベースサーバーを使用するように各アプリケーションサーバーを一度に1つずつ再構成し、再起動します。
  7. 新しいデータベースのレプリケーションをオンに戻します。
  8. 元のサーバーが復旧したら、そのデータベースサーバーを再度使用するようにアプリケーションを再構成します(適切な再起動を行います)。
  9. レプリケーションを停止し、新しいデータベースサーバーをオフにします。
于 2012-09-28T15:21:25.353 に答える