2012-04-12 14 views
1

私は2、データベース、maintempを持っていると仮定すると、私はtempに類似したテーブルを作成する方法、mainentries表に対応のActiveRecordクラスEntryを持っています。ActiveRecordを使用してRails内の別のデータベースにテーブルを複製する方法はありますか?

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

これを行うには良い方法がありますか?好ましくは、「表の作成」式を呼び出すことを読まずに&を呼び出すこと。

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

ありがとうございました。

+0

をしたい場合は、すべてのメソッドは、最終的権利、ショーはtable'を作成 '呼ぶことを実現していますか?あなたはそれを自分で呼ぶことはしたくないのですか? :) –

+0

@SergioTulentsev私は、ActiveRecordアダプタが私のためのテーブル構文の作成に微妙な違いを扱うと仮定しています。例えば一方のテーブルがMySQLで、他方がSQLiteである場合 – z5h

答えて

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、ADD_INDEXを使用して、その構造を表現する、として作成されます。これはデータベースに依存しないため、Active Recordがサポートするデータベースにロードできます。これは、複数のデータベースに対して実行できるアプリケーションを配布する場合に非常に便利です。

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

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

1

あなただけの宝石を使用して、あるデータベースから別のデータベースに移動する「yaml_db」

+0

興味深いですね。しかし、仲介者としてのyamlファイルは必要ありません。ありがとう。 – z5h

関連する問題