2011-12-02 69 views
0
create table foo (id auto increment primary key, name varchar(255)) 

期間遞增的主鍵我寫上self.up創建一個新的記錄,並丟棄它self.dropdelete(:id => 1)一個簡單的Rails遷移腳本。如果我執行db:migrate,會創建一個id = 1的新條目,如果我回滾它,它將被刪除。如果我使用主鍵id = 2創建記錄並且我的drop腳本在回滾時失敗,則會再次遷移/丟棄時會出現問題。如何處理自動遷移

主鍵每次都是相同的,這是非常重要的,因爲我有其他依賴關係。什麼應該是正確的方式來處理這個問題。

回答

0

我認爲處理它的正確方法是刪除表而不是刪除記錄。當您在self.up方法中創建表時,您可以對其執行刪除操作。

def down 
    drop_table :system_settings 
    end 
2

您不應該使用遷移來添加種子數據,而應該使用db/seed.rb文件。當你做rake db:reset時,這將重新安裝你的種子數據,這也將重置你的ID計數器,因此數據將具有可預測的ID。通過遷移添加的數據在執行rake db:reset時不會重新加載!

+0

這是否會刪除並重新創建種子數據,這可能會失敗,因爲會有其他記錄對種子數據具有外鍵依賴關係。 – priya

+0

是的,db:reset將刪除並重新創建僅包含種子數據的數據庫。因此,在您想要保存數據庫的數據的生產環境中,這不是一種方法。 – harald

0

這樣做的事情是MySQL中的AUTO_INCREMENT選項。我不認爲ActiveRecord可以讓你關閉它。但是,您可以通過刪除MySQL中的id字段的AUTO_INCREMENT值來關閉它(您必須爲此執行MySQL查詢。)

第二種想法是,在數據庫中維護一些孤立記錄。我不認爲這是正確的做法。嘗試從Rails控制檯中刪除這些東西,並使用正確設置的模型在母記錄被刪除時刪除相關記錄,然後使用一些rake腳本或其他方式再次添加數據並設置所需的關聯。