1、抽象層上看看 migration 遷移:
需要更改資料庫結構,我們便建立乙個資料庫 migration 遷移,
將這個 migration 遷移放在乙個單獨的檔案內
,在遷移內(用一定的格式)描述資料庫更改的內容 ,並 將遷移與另外的應用程式檔案一起放在版本控制下。然後對資料庫使用這個 migration 遷移(執行遷移),結果資料庫結構被更改 。
每個 migration 遷移都會有乙個序號與其關聯,這些序號從 1 開始, 新的 migration 遷移都會得到下乙個有效序號, rails 會記住應用給資料庫 migration 遷移的最後乙個序號。當執行遷移時,rails 將資料庫 schema 的序號與有效的 migragion 遷移序號進行比較,如果它發現 migration 遷移的序號大於資料庫的 schema ,它就會應用(執行) migration 遷移。
我們通過讓每個 migration 遷移都是可回溯的來
回溯 schema
的版本
。每個 migration 遷移例項上都包含兩個指令集。一套告訴 rails 在應用 migration 遷移時對資料庫做出什麼修改,另一套則告訴 rails 如何回溯這些修改。 要回溯乙個 schema ,我們只要簡單地告訴 rails 我們需要資料庫 schema 序號就可以了。如果當前資料庫 schema 有個比目標序號更高的序號,則 rails 會接受帶有資料庫當前序號的 migration 遷移,並使用它進行回溯。這會從 schema 中移除 migration 遷移的修改,並降低資料庫的序號。它會反覆執行此過程直到得到期望的資料庫版本。
具體如下:當執行 rake db:migrate命令時rake首先檢查schema_info 表(該錶一行一列,由migration遷移**管理,用於記住當前的資料庫版本。
)。如果該錶不存在,它將建立乙個並且生成版本號為當前時間 的記錄。若該錶存在,則從表中讀取版本號。
然後 migration 遷移**檢視 db/migrate 目錄下的所有 migration 遷移檔案。如果有序號 晚於 當前資料庫的版本號,那麼會為資料庫依次應用每個 migration 遷移檔案。在最晚乙個 migration 遷移檔案應用後, schema_info 表的版本號會被更新為該檔案的序號。
如果我們這一序號上再次執行 migration 遷移,則不會發生任何事。
但是,如果我們隨後建立了乙個新的 migration 遷移檔案,它就會有個晚於資料庫版本號的序號。如果我們隨後執行該 migration ,則這個新的 migration 遷移檔案會被執行。
可以通過給 rake db:migrate 命令列應用 version= 引數來為資料庫強制指定乙個特定的版本號。如果你給出的版本號晚於資料庫的版本號,則會以執行資料庫版本的 migration 開始,以你指定的版本 migration 結束。
如果命令列的版本號早於當前資料庫的版本號, 任務 查詢與資料庫版本匹配的 migration 遷移檔案,並且回溯它,之後降低資料庫版本號,查詢匹配檔案,再回溯它,直到版本號匹配命令列中指定版本號。也就是說, migration 遷移被向後應用以回溯 schema 回到你指定版本。
2、相關情況
(1)遷移檔案的建立:可手工建立但一般要用生成器來建立,生成器在生成模型的同時將會生成遷移檔案(ruby script/generate model discount),也可用生成器直接生成遷移檔案(script/generate migration add_price_column)。
(2)遷移檔案
class addemailcolumntoorders < activerecord::migration
def self.up
add_column :orders, :e_mail, :string
enddef self.down
remove_column :orders, :e_mail
endend
(2)migration 遷移支援的(column type )列型別包括:
:binary , :boolean , :date , :datetime , :float , :integer , :string , :text , :time ,和 :timestamp 。
為支援不同資料庫之間的遷移,rails migration
將從具體的資料庫型別系統隔離開而使用邏輯型別。如果你遷移乙個 mysql
資料庫,那麼 :string
型別將建立乙個 varchar(255)
型別的列。在 postgres
上,同樣的遷移會新增乙個 varing(255)
型別的列。
(3)在定義資料庫列型別時可指定三個選項,每個選項由 key=>value 對給出:
1 、 :null => true or false
如果為 true ,則基礎列被新增乙個不能為 null 的約束 ( 如果資料庫支援的話 ) 。
2 、 :limit => size
設定字段尺寸的限制。這基本上出現在用 string 建立資料庫的列時。
3 、 :default => value
為列設定預設值時,如果傳遞乙個 ruby 值 ( 或 ruby 表示式 ) ,這個值便會成為的預設值。對一些資料庫,你也可以傳遞乙個包含資料庫指定表示式的字串。例如,指定 add_column :orders, :placed_at, :datetime, :default => time.now 將在 migration 遷移執行時,設定列的預設值為日期和時間,指定 add_column :orders, :placed_at, :datetime, :default => "now()" 會設定 mysql now() 函式為預設值,因此當前日期時間將被插入到任何新的行內。後面的語法很明顯是資料庫指定的。
遷移型別選項的例子:
add_column :orders, :name, :string, :limit => 100, :null => false
add_column :orders, :age, :integer
add_column :orders, :ship_class, :string, :limit => 15, :default => 'priority'
rails 2 0檔案上傳
1.表單 form for admin,album html do f 檔案上傳控制項 file field file,album img 曾試過將檔案控制項也寫出與model相關聯的方式 f.file field album img 但在修改記錄時處理有些麻煩,所以將檔案上傳的控制項與model屬...
建立乙個rails3 engine
rails3中的engine 比較強大,現在寫gem,可以以 engine為基礎構建。而且慢慢地可以把rails程式分模組拆分。rails 3.1中更可以把engine以rake的方式載入。比如 建立乙個engine,有個 gem可讓我們的工作更加方便 url 事先安裝好enginex sudo g...
在heroku上部署rails3應用
以下是我的實際測試步驟 1.登入www.heroku.com註冊賬戶 3.在git bash toolbelt會安裝該軟體 中登入heroku 4.安裝rails gem install rails 已安裝則跳過此步 5.cd d dev ruby 7.開啟檔案 gemfile 將gem sqlit...