17

元のテーブルのすべてのインデックスを含め、名前に接尾辞を付けるだけで、既存のテーブルのクローンを作成する移行が必要です。

したがって、「snapshots」テーブルがあり、テーブルの正確なコピーとして「snapshots_temp」を作成したいと思います(データではなく、テーブルスキーマだけで、インデックスを含みます)。

ブロックをコピーしてschema.rbファイルから貼り付け、手動で名前を変更するだけです。

しかし、この移行が適用されるまでに、schema.rbからの定義がまだ正確であるかどうかはわかりません。別の開発者がテーブルを変更した可能性があり、移行スクリプトを更新する必要はありません。

では、実行時にテーブルのスキーマを取得するにはどうすればよいでしょうか。基本的に、「rake schema:dump」はどのようにテーブルをリバースエンジニアリングして、移行でも同じことができるようにしますか?(ただし、テーブル名を変更します)。

4

5 に答える 5

30

純粋なSQLでそれを試してみてください。これはあなたが望むことをします:

CREATE TABLE new_tbl LIKE orig_tbl;
于 2009-10-12T03:47:36.487 に答える
6

Rails 4 & PostgreSQL では、新しい移行を作成して挿入します。

ActiveRecord::Base.connection.execute("CREATE TABLE clone_table_name AS SELECT * FROM source_table_name;")

これにより、元のテーブルとまったく同じ構造のクローンが作成され、新しいテーブルに古い値が入力されます。

詳細: http://www.postgresql.org/docs/9.0/static/sql-createtableas.html

于 2014-05-10T17:31:35.907 に答える
5

これで十分です。テーブル オプションやインデックスをコピーしないため、完全ではありません。テーブル オプションが設定されている場合は、手動でこの移行に追加する必要があります。

インデックスをコピーするには、SQL クエリを作成してインデックスを選択し、それらを新しい add_index ディレクティブに処理する必要があります。それは私の知識を少し超えています。しかし、これは構造をコピーするために機能します。

class CopyTableSchema < ActiveRecord::Migration
  def self.up
    create_table :new_models do |t|
      Model.columns.each do |column|
        next if column.name == "id"   # already created by create_table
        t.send(column.type.to_sym, column.name.to_sym,  :null => column.null, 
          :limit => column.limit, :default => column.default, :scale => column.scale,
          :precision => column.precision)
      end
    end

    # copy data 

    Model.all.each do |m|
      NewModel.create m.attributes
    end
  end

  def self.down
    drop_table :new_models
  end
end
于 2009-10-12T03:32:29.367 に答える
0

このロジックはActiveRecord::SchemaDumperにラップされているように見えますが、これはオールインワンの「ダンプ」メソッドのみを公開し、特定のテーブルだけをダンプすることはできません(「テーブル」メソッドはプライベートです)。

于 2009-10-11T17:40:37.810 に答える