428

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

4

5 に答える 5

609

次に例を示します。

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 および 4 では、ActiveRecord::Migration::CommandRecorderrename_table の移行を元に戻す方法を知っているため、次のように実行できます。

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

(まだ、手動でファイルの名前を変更する必要があります。)

于 2009-01-23T00:29:42.660 に答える
76

Rails 4 では、def を変更するだけで済みました。

def change
  rename_table :old_table_name, :new_table_name
end

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

また、インデックスに関しても、上下の変更を使用して機能します。

于 2013-12-17T01:27:55.740 に答える
54

他の回答とコメントでは、テーブルの名前変更、ファイルの名前変更、およびコードの 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 を実行するときは、文字列の単数形、複数形、大文字、小文字、さらには大文字 (コメントで発生する可能性があります) のバージョンを検索することを忘れないでください。
  • 最初に複数形を検索してから、単数形を検索することをお勧めします。そうすれば、私の商人 :: ビジネスの例のように、不規則な複数形がある場合、すべての不規則な複数形を正しく取得できます。そうしないと、たとえば、中間状態として「businesss」(3 つの s) になってしまい、さらに多くの検索と置換が行われる可能性があります。
  • すべてのオカレンスをやみくもに置き換えないでください。モデル名が一般的なプログラミング用語、他のモデルの値、またはビューのテキスト コンテンツと衝突する場合、過度に熱心になる可能性があります。私の例では、モデル名を「ビジネス」に変更したかったのですが、UI のコンテンツでは引き続き「マーチャント」として参照しています。また、CanCan でユーザー用に「マーチャント」ロールを持っていました。マーチャント ロールとマーチャント モデルを混同したため、そもそもモデルの名前を変更する必要がありました。
于 2012-09-17T20:06:35.990 に答える
29

また、インデックスを置き換える必要があります。

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

この移行を記述した後、ロールバックおよびロールフォワードできることを確認してください。何か問題が発生し、存在しなくなったものに影響を与えようとする移行でスタックした場合、注意が必要になる可能性があります。データベース全体をゴミ箱に移動し、ロールバックできない場合は最初からやり直すことをお勧めします。したがって、何かをバックアップする必要があるかもしれないことに注意してください。

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

そして最後に、回帰テストスイートなしでこれを行うのは面倒です。

于 2012-12-05T07:30:48.093 に答える