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