2009-01-13 41 views
16

我有一個小型數據庫,並通過Rails頁面添加條目。我「銷燬」了其中一個條目,現在我的ID序列跳過了一個。例如,我現在有42,然後44,而不是顯而易見:42,43,44.從Rails控制檯修改數據庫ID?

我想知道是否有方法通過控制檯編輯新對象的ID號。我曾嘗試:

record.id = 43 
record.save 

record = record.new 
record.attributes = { :id => 43 } 

但都沒有奏效。我相當肯定必須有一個控制檯方法,但我似乎無法在Google上找到很多具體的內容,並且我可能錯誤地閱讀了Rails API ......我是否可能必須通過sqlite中的直接SQL執行此操作?

感謝

回答

4

請問我有可能通過直接的SQLite SQL做到這一點?

是的。

ActiveRecord的重點在於,它是摘要數據庫函數,只是返回數據集合。你不應該擔心記錄的ID,這是DB特有的。關於我的頭頂,我想不出任何理由來引用模型的ID。

如果你的應用程序依賴於有一個序列號,那麼你應該添加另一個字段到這個模型。例如,如果我有一個商店(產品模型),並且我提供了DB提供給其他供應商的ID號。兩個星期後,我的老闆要求我爲兩種產品有一個獨特但相似的ID:「45a」和「45b」。堅果。 ID字段只能用於數據庫和ActiveRecord,而不是您或您的用戶,以識別記錄。

有一個小的機會,可能是一個晦澀的方法,強制設置的ID如果數據庫允許它,但它是模糊的原因。不要試圖找到它:)

所有這一切,輸入ruby script/dbconsole快速拉起sqlite界面,而不必輸入您的密碼。

此外,如果您刪除將重置計數器,並從0開始的sqlite數據庫。隨着巨大的權力來承擔巨大的責任。

編輯

如果我沒有記錯戴夫·托馬斯寫了這個地方。也許here

+1

這是一個非常snarky和無益的評論。不值得標記,但值得修改。 – ivanreese 2013-02-04 08:42:37

23

其實,你可以爲新對象手動設置ID:

record = Record.new 
record.id = 1234 
record.save 

但是,你正在做的是更新現有對象的ID。當您設置record.id = 43然後調用save什麼情況是,ActiveRecord的將嘗試生成SQL這樣的:

update records set id = 43 where id = 43

注意,它是尋找更新的ID是一樣的,你要嘗試一個改變。這就是爲什麼它不起作用。因此,你將不得不使用SQL來改變這一點。這是否是一個好主意是另一個問題,但有時需要完成。

+0

第一個代碼適用於我。謝謝! – 2011-06-15 20:10:31

+1

偉大的解決方案,我希望我可以對它進行雙重投票以使其達到最高。我喜歡解釋問題的解決方案。我發現它用於實現規範化的「枚舉」。例如,用戶可能有很多角色,但這些角色在部署中將保持一致,所以我使用rake任務添加它們。硬編碼他們的ID確保他們在我的本地盒子和服務器上是一樣的。 Nitpicky,並可能永遠不需要,但它使我稍微少刺激:) – 2011-12-24 16:22:54

39

最好的方法是直接執行SQL,並解決序列中的暫時故障。

嘗試訪問控制檯(Ruby腳本/控制檯),然後輸入:

>> sql = "update records set id=43 where id=44" 
>> ActiveRecord::Base.connection.execute(sql) 

凡44新創建的對象的ID和43是你缺少你的表

好運的一個!