我有一個Rails應用程序,其中包含用於一個表的id
生成的自定義算法。現在我決定使用由Postgres生成的默認增量id作爲主鍵,並將我的自定義值從id
移動到另一列,如uid
。我想爲所有記錄在id
列中重新生成值 - 正常情況下從1到n。
這樣做的最好方法是什麼?我有大約1000條記錄。其他表中的記錄與這些記錄相關聯。重新生成現有記錄的ID
1
A
回答
0
您可以簡單地通過迭代您的記錄並更新它們(及其關聯的對象)來完成。 1000條記錄沒有太多要處理。
假設您有一個名爲「my_objects」的表,其模型名爲「MyObject」。我們還要說,你有另一個名爲「related_objects」的表,它的模型「RelatedObject」
你可以遍歷所有的MyObjects記錄,並且同時更新它們的相關對象和記錄本身。
records = MyObject.all #Whatever "MyObject" you have.
i = 0
records.each do |record|
#Updating whatever associated objects the record have
record.related_objects.each do |related_object|
related_object.update_column("my_object_id", i)
end
#Updating the record itself
record.update_column("id", i)
i++
end
0
你可以把任何值是ID列,但新建一個名爲列UID並將其設置爲一個主鍵和自動遞增
def self.up
execute "ALTER TABLE mytable modify COLUMN uid int(8) AUTO_INCREMENT"
end
你可以告訴你的模型使用UID作爲主要關鍵爲
self.primary_key = 'uid'
相關問題
- 1. 重新生成會話ID
- 2. 標記重複的時差,生成ID
- 3. 重新生成新的記錄的標識列(SQL)
- 4. 用自動生成的ID插入一條新記錄
- 5. Simperium重複現有記錄
- 6. 更新現有記錄
- 7. 上更新現有記錄
- 8. 更新現有記錄表的外鍵表的ID
- 9. 重新映射NHibernate ID生成
- 10. 返回新記錄的ID
- 11. 有沒有辦法重新生成leiningen中的目標目錄?
- 12. 爲什麼Hibernate嘗試使用現有ID插入新記錄?
- 13. 創建新記錄而不是更新現有記錄
- 14. Rails ActiveRecord.new創建新記錄而不是更新現有記錄
- 15. 從生成的記錄集
- 16. LINQ的更新現有記錄
- 17. 更新CakePHP中的現有記錄
- 18. 更新現有的Memcached記錄
- 19. 從子記錄生成父記錄
- 20. wix - heat.exe生成目錄ID
- 21. 實現id生成器angularjs
- 22. SQL Server 2008生成數據腳本並檢查現有記錄
- 23. 更新parse.com中的現有記錄不工作它做重複
- 24. 記錄滿足沒有重新實現的隱式接口
- 25. 刷新或重置codeigniter活動記錄沒有執行後生成?
- 26. Nhibernate:插入新記錄更新表中的所有現有記錄
- 27. 在插入新記錄之前檢查現有記錄的表
- 28. 如何將新記錄追加到jqGrid中的現有記錄?
- 29. 新記錄獲取自動生成的id值。如何獲得0作爲ExtJs 4中的新ID?
- 30. 識別重複的記錄並使用首次出現的ID進行更新
我該如何處理habtm關係?當我更改主鍵時,他們不會自動更新。我也認爲我應該在交易中包裝更新? – leemour
您可以爲habtm關聯的中間表創建臨時ActiveRecord模型(如在「has_many through」關聯中),並使用它來更新該表中的鍵,就像任何關聯的對象一樣。 http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many – Caillou
如何刪除舊ID的關聯並重新創建新ID ? 'objects = record.associatied_objects.map(&:id); record.associatied_objects = []; record.save !; Object.where(id:objects).each {| o | record << o}'< - 這樣? – leemour