RailsでActiveRecordモデルとそのテーブルの名前を変更する移行をどのように記述しますか?

StackOverflow https://stackoverflow.com/questions/471416

質問

ネーミングがひどいので、Railsアプリのモデルにはもっと良い名前のセットがあることに気付きます。
移行を使用してモデルとそれに対応するテーブルの名前を変更する方法はありますか?

役に立ちましたか?

解決

例を次に示します。

class RenameOldTableToNewTable < ActiveRecord::Migration
  def self.up
    rename_table :old_table_name, :new_table_name
  end

  def self.down
    rename_table :new_table_name, :old_table_name
  end
end

手動でモデル宣言ファイルの名前を変更する必要がありました。

編集:

Rails 3.1 <!> amp; 4、ActiveRecord::Migration::CommandRecorderはrename_tableの移行を逆にする方法を知っているので、これを行うことができます:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
    rename_table :old_table_name, :new_table_name
  end 
end

(まだファイルを調べて手動でファイル名を変更する必要があります。)

他のヒント

Rails 4では、defを変更するだけでした

def change
  rename_table :old_table_name, :new_table_name
end

そして、私のインデックスはすべて私のために世話をされました。古いインデックスを削除して新しいインデックスを追加することで、インデックスを手動で更新する必要はありませんでした。

そして、インデックスに関しても上下するための変更を使用して動作します。

他の回答とコメントでは、テーブルの名前変更、ファイルの名前変更、コード全体のgrepについて説明しました。

さらにいくつかの警告を追加したい:

今日直面した実世界の例を使用してみましょう。モデルの名前を「商人」から「ビジネス」に変更します

  • で依存テーブルとモデルの名前を変更することを忘れないでください 同じ移行。 MerchantモデルとMerchantStatモデルをBusinessとBusinessStatに同時に変更しました。そうでなければ、検索と置換を実行するときに、あまりにも多くの選択と選択を行わなければならなかったでしょう。
  • 外部キーを介してモデルに依存する他のモデルの場合、他のテーブルの外部キー列名は元のモデル名から派生します。そのため、これらの依存モデルでいくつかのrename_column呼び出しを行うこともできます。たとえば、さまざまな結合テーブル(has_and_belongs_to_many関係の場合)およびその他の依存テーブル(通常のhas_oneおよびhas_many関係の場合)で、「merchant_id」列の名前を「business_id」に変更する必要がありました。そうでなければ、「business.id」を指す「business_stat.merchant_id」のような列になってしまいます。 ここでは、列名の変更についての良い回答があります。
  • grepするときは、単数形、複数形、大文字、 小文字、さらには大文字(コメントに含まれる場合もあります)バージョン あなたの文字列の。
  • 最初に複数形を検索し、次に単数形を検索するのが最善です。それ あなたが不規則な複数形を持っている場合の方法-私の商人などで: ビジネスの例-すべての不規則な複数形を正しく取得できます。 そうしないと、たとえば、「ビジネス」(3秒)で終わる可能性があります 中間状態で、さらに検索と置換が行われます。
  • すべての出現を盲目的に置き換えないでください。モデル名が衝突する場合 一般的なプログラミング用語、他のモデルの値、または ビュー内のテキストコンテンツは、過度に熱心になる可能性があります。 私の例では、モデル名を「ビジネス」に変更したかったのですが、 私のUIのコンテンツでは、まだそれらを「商人」と呼んでいます。また、CanCanのユーザーには「マーチャント」の役割がありました。マーチャントの役割とマーチャントモデルの混乱により、そもそもモデル名を変更しました。

インデックスも置き換える必要があります:

class RenameOldTableToNewTable< ActiveRecord:Migration
  def self.up
    remove_index :old_table_name, :column_name
    rename_table :old_table_name, :new_table_name
    add_index :new_table_name, :column_name
  end 

  def self.down
    remove_index :new_table_name, :column_name
    rename_table :new_table_name, :old_table_name
    add_index :old_table_name, :column_name
  end
end

また、他の回答で説明されているように、手動でファイルの名前を変更するなど。

参照: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

この移行を作成した後、ロールバックおよびロールフォワードできることを確認してください。何か問題が発生し、存在しなくなったものに影響を与えようとする移行に取り付かれると、注意が必要になります。データベース全体を破棄して、ロールバックできない場合は再度開始することをお勧めします。そのため、何かをバックアップする必要がある場合があることに注意してください。

また、schema_dbで、has_、belongs_toなどによって定義された他のテーブルの関連する列名を確認します。おそらくこれらも編集する必要があります。

最後に、回帰テストスイートなしでこれを行うのは簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top