8

在Rails應用程序中,如何遷移我在模型中所做的更改?例如,我知道如果使用命令「rails g model Person name:string」創建模型,也會創建一個遷移。但是,如果在這一步之後,我會轉到創建的模型「Person」並添加一個新屬性,這個新屬性會自動添加到遷移中以便稍後在數據庫中持久化? 或者我從錯誤的角度看待這個問題,應該將一個屬性添加到遷移中,然後添加到模型中?Ruby on Rails:如何遷移對模型所做的更改?

問候

回答

9

你不能真正的「添加」的屬性模型,你這樣做,通過創建遷移文件並運行它 - Rails的數字根據數據庫中的列來確定模型的屬性。但是,如果您希望能夠通過批量分配更新該屬性,則需要向該模型添加一行以將該屬性列入白名單。這就是爲什麼你會經常看到這樣一行在ActiveRecord的模型:

attr_accessible :name 

但是,這是可選的,並沒有必要添加屬性。

要將新屬性實際上添加到模型中,首先創建一個遷移:

rails g migration AddAddressToPerson address:string 

,將創建在db /遷移/目錄遷移文件。 (Rails將表單「AddXXXToYYY」和「RemoveXXXFromYYY」理解爲「將新列添加(或刪除)到模型XXX」,詳情請參見documentation)。在這種情況下,我添加了一個名爲address的屬性,它是一個字符串,但您可以將其改爲任何您想要的。

然後,爲了更新數據庫,你需要用rake運行遷移:

rake db:migrate 

最後,如果你想允許該屬性質量分配的屬性添加到您的參數列表來attr_accessible

attr_accessible :name, :address 

這應該做到這一點。

+0

僅供參考:您的「大規模分配」鏈接給了我404。 – Niek

+0

謝謝,鏈接刪除。 –

2

如果您正在使用attr_accessor增加新的屬性,你不需要做任何的遷移,但這些變更不會存儲在數據庫中。

如果您確實想要保留更改,則需要使用migration將該屬性添加到模型中。你可以創建一個文本文件,但是正確的結構,遷移並不是什麼奇特的事情,但是像這樣產生就更容易了,如rails generate migration AddLastNameFieldToUsers。這樣一個文件的內容可能會有所調整,看起來像這樣:

class AddLastNameFieldToUsers< ActiveRecord::Migration 
    def change 
    add_column :users, :last_name, :string 
    end 
end 
0

您不需要直接向模型添加屬性。 Rails(實際上是ActiveRecord)自動推斷它。對於模型類的屬性列表,AR查找具有模型名稱的複數形式的表(如果模型是Order,則它將查找訂單表中的屬性)。它是名爲CoC - 設計約定的設計特徵的一部分。

因此,如果您必須添加屬性,則必須創建一個遷移以將該字段添加到列中,如其他答案中所述。