2013-05-09 55 views
0

我剛接觸rails並試圖理解遷移和模型之間的關係。據我所知,遷移似乎只會影響數據存儲,因此在使用腳手架創建資源之後,我是否負責保持模型和遷移同步?有沒有什麼工具可以幫助解決這個問題?爲什麼不進行遷移更新模型?

對不起,如果這是一個明顯的問題,我仍然在通過文檔工作。

+0

你所說的'在sync'模型和遷移意思?你應該添加一個新的遷移,並開始在你的模型上使用新的屬性,而不是繼續編輯現有的遷移(當然,你可以,但是......) – fotanus 2013-05-09 15:26:43

+0

我的困惑部分源於使用腳手架來生成一個資源將attr_accessible添加到模型中。我感到驚訝的是,創建遷移以添加新字段並未更新模型.... – 2013-05-09 16:21:23

+0

'attr_accessible'是大規模分配白名單。想象一下,如果Rails爲模式添加了諸如'admin'之類的東西,Rails會自動更新它! – mikeryz 2013-05-09 16:32:16

回答

3

所有遷移都是修改數據庫。 Rails處理維護模型和數據庫之間的同步。

你可以有一個具有idfirs_name一個User表和你的類模型可能是這樣

class User < ActiveRecord::Base 
end 

正如你所看到的模型類是空的,你仍然可以在該類幾乎訪問方法像這樣:

@user = User.new 
@user.first_name = "Leo" 
@user.save! 

它會知道如何處理它。

遷移只是允許您在增量步驟中修改數據庫,同時在數據庫模式上保持一個合理的版本控制的文件。

當然,如果您嘗試從您的模型中調用數據庫中不存在的或父類的ActiveRecord::Base父類中的內容,Rails會投訴。

@user = User.new 
@user.awesome 
#=> undefined method `awesome` for #<User:some_object_id> 

至於遷移,可以有多個影響一個表的遷移。你的工作只是知道你已經添加到模型中的屬性。 Rails將爲您完成剩下的工作。

+0

因此,爲了檢查我的理解,類模型將永遠不會包含有關通過遷移定義的字段的信息,並且模式信息的主要來源是schema.rb而不是模型文件? – 2013-05-09 16:13:06

+0

我想在某種程度上。該模式僅表示遷移到目前爲止寫入數據庫的內容。它以簡單的紅寶石形式出現,或者也可以將它作爲SQL輸出。實際上模型和數據庫之間的交互是ActiveRecord :: Base。特別是如果你執行'SomeModel.new.method(:some_method).source_location',它會指向方法的定義位置,有趣的是它指向'lib/active_record/attribute_methods/read.rb' – 2013-05-09 23:42:58

0

一般的經驗法則是,遷移最適合數據定義 - 表中的列,它們的類型,約束條件等。因此,不需要保持遷移與數據同步。

如果在較長時間內,數據定義本身發生更改(新列或列類型更改),則只需添加指定相同的新遷移。

0

ActiveRecord模型一般來自數據庫。數據庫中定義的任何字段(通常)都會自動顯示爲綁定到該表的activerecord模型中的屬性。

改變模型不會改變模式(通常)。要改變模型,通常會定義一個遷移並將其運行到數據庫中。

請注意,沒有任何東西會阻止您使用attr_accessor等在模型上定義其他屬性,但如果它們所綁定的模式中沒有列,那麼這些屬性將不會被ActiveRecord持久化。

0

如果要恢復attr_accessor中行爲,而給白名單給出一個黑名單,你可以使用這個每個模型做:

attr_accesible *atribute_names - %(attributes black list) 
相關問題