1

2 つのデータベースがmainあり、 のテーブルに対応するtempActiveRecord クラスがあると仮定すると、 で同様のテーブルを作成するにはどうすればよいでしょうか。Entryentriesmaintemp

最初の刺し傷はEntry.connection.execute('show create table #{Entry.table_name}')、別のテーブルに対してそれを使用して呼び出すことです。(maintempが同じ種類のデータベースである場合に機能します)。

それを行うより良い方法はありますか?できれば、「テーブルの作成」式の読み取りと呼び出しを伴わないもの。

たとえば、ActiveRecord::Schema.define を使用したものが最適のようです。しかし、私は何をすべきか正確にはわかりません。

ありがとう。

4

2 に答える 2

2

簡単なグーグル検索の後、生のSQLなしでこれを達成するための既製の方法が見つかりませんでした。ただし、機能を模倣することで、独自のソリューションを作成できますannotate_models

https://github.com/ctran/annotate_models/blob/master/lib/annotate/annotate_models.rbの一部

# Use the column information in an ActiveRecord class
# to create a comment block containing a line for
# each column. The line contains the column name,
# the type (and length), and any optional attributes
def get_schema_info(klass, header, options = {})
  info = "# #{header}\n#\n"
  info << "# Table name: #{klass.table_name}\n#\n"

  max_size = klass.column_names.collect{|name| name.size}.max + 1
  klass.columns.each do |col|
    attrs = []
    attrs << "default(#{quote(col.default)})" unless col.default.nil?
    attrs << "not null" unless col.null
    attrs << "primary key" if col.name == klass.primary_key

    col_type = col.type.to_s
    if col_type == "decimal"
      col_type << "(#{col.precision}, #{col.scale})"

また、 ActiveRecord Migrations Guideが提供するものを読みたいと思うかもしれません。

ActiveRecord::Schema.define(:version => 20080906171750) do
  create_table "authors", :force => true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end

このファイルは、データベースを検査し、create_table、a​​dd_index などを使用してその構造を表現することによって作成されます。これはデータベースに依存しないため、Active Record がサポートする任意のデータベースにロードできます。これは、複数のデータベースに対して実行できるアプリケーションを配布する場合に非常に役立ちます。

ただし、トレードオフがあります。db/schema.rb は、外部キー制約、トリガー、ストアド プロシージャなどのデータベース固有の項目を表現できません。移行中にカスタム SQL ステートメントを実行できますが、スキーマ ダンパーはデータベースからそれらのステートメントを再構成することはできません。このような機能を使用している場合は、スキーマ形式を :sql に設定する必要があります。

Active Record のスキーマ ダンパーを使用する代わりに、データベースの構造は、データベース固有のツールを使用して (db:structure:dump Rake タスクを介して) db/structure.sql にダンプされます。たとえば、PostgreSQL RDBMS の場合、pg_dump ユーティリティが使用されます。MySQL の場合、このファイルにはさまざまなテーブルの SHOW CREATE TABLE の出力が含まれます。これらのスキーマのロードは、スキーマに含まれる SQL ステートメントを実行するだけの問題です。定義上、これによりデータベース構造の完全なコピーが作成されます。ただし、:sql スキーマ形式を使用すると、スキーマの作成に使用されたもの以外の RDBMS にスキーマをロードできなくなります。

于 2012-04-13T00:14:57.247 に答える
1

あるデータベースから別のデータベースに移動するだけの場合は、gem 'yaml_db' を使用します

于 2012-04-13T04:16:30.853 に答える