2015-10-13 67 views
1

我有一個Rails應用程序,其中包含用於一個表的id生成的自定義算法。現在我決定使用由Postgres生成的默認增量id作爲主鍵,並將我的自定義值從id移動到另一列,如uid。我想爲所有記錄在id列中重新生成值 - 正常情況下從1到n。
這樣做的最好方法是什麼?我有大約1000條記錄。其他表中的記錄與這些記錄相關聯。重新生成現有記錄的ID

回答

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

我該如何處理habtm關係?當我更改主鍵時,他們不會自動更新。我也認爲我應該在交易中包裝更新? – leemour

+0

您可以爲habtm關聯的中間表創建臨時ActiveRecord模型(如在「has_many through」關聯中),並使用它來更新該表中的鍵,就像任何關聯的對象一樣。 http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many – Caillou

+0

如何刪除舊ID的關聯並重新創建新ID ? 'objects = record.associatied_objects.map(&:id); record.associatied_objects = []; record.save !; Object.where(id:objects).each {| o | record << o}'< - 這樣? – leemour

0

你可以把任何值是ID列,但新建一個名爲列UID並將其設置爲一個主鍵和自動遞增

def self.up 
    execute "ALTER TABLE mytable modify COLUMN uid int(8) AUTO_INCREMENT" 
    end 

你可以告訴你的模型使用UID作爲主要關鍵爲

self.primary_key = 'uid'