快速Google搜索後,我沒有找到現成的方法來實現這一點,沒有原始的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之外。
你一定要明白,每一個方法最終會調用'秀創建table',對不對?你只是不想自己打電話嗎? :) – 2012-04-13 00:05:37
@SergioTulentsev我假設ActiveRecord適配器將處理爲我創建表語法的細微差異。例如如果一個表是MySQL,另一個是SQLite。 – z5h 2012-04-13 00:11:01