5

我有兩個模式之間的現有關係的has_many - 稱他們爲「汽車」和「乘客」 - 有幾千元「乘客」屬於幾百「卡」在我的生產環境中。我添加了另一個模型,稱之爲「火車」,並且我想將汽車和乘客之間現有的has_many關係改爲將每個乘客與汽車或火車相關的多態。更改現有的has_many關係多態性在Rails 3中

應我的移民是什麼樣子?我想在遷移時保留數據庫中的現有關係,所以我寧願做一些表重命名而不是刪除一列來替換另一列。此外,我希望能夠在不打開服務器控制檯並手動編輯所有記錄的情況下執行此操作,因此,當我將更改推送到生產時,我可以一舉遷移整個數據庫。有什麼建議麼?

TL; DR:我如何改變現有的has_many關係多態與一個新的模式?

+0

我現在必須做同樣的事情,但對於請求模型。我會發布我的結果 – rpearce 2013-04-29 12:50:01

+0

我最終使用下面的解決方案。無摩擦 – rpearce 2013-04-29 15:54:16

回答

23

你將不得不寫一些像遷移

  1. 兩列添加到乘客表。 - >導軌克遷移change_column_in_passenger

  2. 在遷移文件,寫入下面的代碼最多方法

代碼:

def up 
    rename_column :passengers, :car_id, :transport_id 
    add_column :passengers, :transport_type, :string 
    Passenger.reset_column_information 
    Passenger.update_all(:transport_type => "Car") 
end 

def down 
    rename_column :passengers, :transport_id, :car_id 
    remove_column :passengers, :transport_type 
end 



因此,這種遷移會更新所有當前Car關係在Passenger。 也會讓火車模型與Passenger有關係。

+2

如何也投入add_index:乘客,[:transport_id,:transport_type]? – rpearce 2013-04-29 16:03:57

+0

我跟@ akshay的建議去了,這似乎在起作用。 add_index語法有什麼作用? – 2013-05-02 22:12:42

+0

索引有助於更好地搜索。 add_index在特定列上應用mysql索引。 – 2013-05-03 05:27:59