2009-11-16 110 views
1

我對Ruby on Rails這裏相當陌生。rake db:migrate正確運行所有遷移

我有2個遷移文件提供。第一個以001爲前綴,爲該表創建一個表格和一些列。下一個遷移文件(以002爲前綴)將行插入到文件001中創建的表中。

運行遷移(rake db:在命令行中遷移)可以正確創建表,但不會插入任何問題。從插入的代碼看起來是這樣的(除了多了很多Student.create陳述,

class AddStudentData < ActiveRecord::Migration 
    def self.up 
     ... 
    Student.create(:name => "Yhi, Manfredo", :gender => "M") 
     ... 
    end 

    def self.down 
    Student.delete_all 
    end 
end 

我的理解是,學生是一個模型對象,所以我的學生模型看起來像這樣,

class Student < ActiveRecord::Base 
end 

我需要明確地定義一個學生創建方法或者是東西,給了(這個項目用腳手架製造)

感謝

編輯1?:我使用達米安的建議,並呼籲create!而不是create,但得到了同樣的迴應。然後我做了什麼,看該代碼是否已達到甚至遠遠是調用此方法,

Student.create12312313!(:name => "foo", :gender => "M") 

這顯然是無效的代碼和遷移沒有拋出任何錯誤。

編輯2:找到答案。 schema_migrations表的版本設置爲3,並且我只有3個不同的遷移文件,因此它從未運行過我的任何遷移文件。這就是爲什麼什麼都不會更新,我使用的虛假創建從未拋出錯誤。學生數據第一次沒有被插入的原因是因爲某個表已經在數據庫中,並且在我第一次遷移時就引發了衝突。所以我真正想要的不是db:migrate而是db:reset花了好幾個小時。

回答

1

create方法繼承自ActiveRecord::Base
所以不,你不需要定義它。

爲什麼你的數據不能被包含的一個原因是你的驗證沒有通過。
通過使用create!而不是create,您可以很容易地看到錯誤使數據不被包含。
因此,如果無法創建模型,將拋出異常並且遷移將失敗。

+0

我做了你的建議,但得到了相同的結果...然後我改變了創建方法廢話(請參閱原始文章的更新)和遷移繼續正常工作。 – tipu 2009-11-16 12:44:01

0

你可能想看看rails 2.3.4中的數據種子。而且您的導軌遷移是否真的在運行001_create_whatever.rb?或者你只是用它作爲例子?因爲2.2.2(iirc)遷移一直使用時間戳,例如10092009 .... create_whatever.rb

您的rails版本有多大?

0

如果模式編號位於數據庫中,遷移將不會運行。

對於舊版本的rails,將會有一行執行最高遷移。

對於較新的版本,每次遷移都會獲取唯一的時間戳作爲其版本號,並在添加後會在schema_migrations中獲取其自己的行。

相關問題