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 回答
1

将项目中的表条目db/schema.rb直接复制到迁移中。只需更改表名即可。

于 2016-05-05T21:26:19.613 回答
0

看起来这个逻辑包含在ActiveRecord::SchemaDumper中,但它只公开了一个一体化的“转储”方法,您不能只转储一个特定的表(“表”方法是私有的)。

于 2009-10-11T17:40:37.810 回答