我剛接觸rails並試圖理解遷移和模型之間的關係。據我所知,遷移似乎只會影響數據存儲,因此在使用腳手架創建資源之後,我是否負責保持模型和遷移同步?有沒有什麼工具可以幫助解決這個問題?爲什麼不進行遷移更新模型?
對不起,如果這是一個明顯的問題,我仍然在通過文檔工作。
我剛接觸rails並試圖理解遷移和模型之間的關係。據我所知,遷移似乎只會影響數據存儲,因此在使用腳手架創建資源之後,我是否負責保持模型和遷移同步?有沒有什麼工具可以幫助解決這個問題?爲什麼不進行遷移更新模型?
對不起,如果這是一個明顯的問題,我仍然在通過文檔工作。
所有遷移都是修改數據庫。 Rails處理維護模型和數據庫之間的同步。
你可以有一個具有id
,firs_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將爲您完成剩下的工作。
因此,爲了檢查我的理解,類模型將永遠不會包含有關通過遷移定義的字段的信息,並且模式信息的主要來源是schema.rb而不是模型文件? – 2013-05-09 16:13:06
我想在某種程度上。該模式僅表示遷移到目前爲止寫入數據庫的內容。它以簡單的紅寶石形式出現,或者也可以將它作爲SQL輸出。實際上模型和數據庫之間的交互是ActiveRecord :: Base。特別是如果你執行'SomeModel.new.method(:some_method).source_location',它會指向方法的定義位置,有趣的是它指向'lib/active_record/attribute_methods/read.rb' – 2013-05-09 23:42:58
一般的經驗法則是,遷移最適合數據定義 - 表中的列,它們的類型,約束條件等。因此,不需要保持遷移與數據同步。
如果在較長時間內,數據定義本身發生更改(新列或列類型更改),則只需添加指定相同的新遷移。
ActiveRecord模型一般來自數據庫。數據庫中定義的任何字段(通常)都會自動顯示爲綁定到該表的activerecord模型中的屬性。
改變模型不會改變模式(通常)。要改變模型,通常會定義一個遷移並將其運行到數據庫中。
請注意,沒有任何東西會阻止您使用attr_accessor等在模型上定義其他屬性,但如果它們所綁定的模式中沒有列,那麼這些屬性將不會被ActiveRecord持久化。
我已經採取了獅子座的回答,因爲他幫助我瞭解的東西更好,如果我剛剛到了頁面底部的遷移我可能沒有必要問:http://guides.rubyonrails.org/migrations.html#what-are-schema-files-for
所提annotate_models寶石也聲音有助於提高對類模型當前結構的瞭解,而無需參考模式。
如果要恢復attr_accessor中行爲,而給白名單給出一個黑名單,你可以使用這個每個模型做:
attr_accesible *atribute_names - %(attributes black list)
你所說的'在sync'模型和遷移意思?你應該添加一個新的遷移,並開始在你的模型上使用新的屬性,而不是繼續編輯現有的遷移(當然,你可以,但是......) – fotanus 2013-05-09 15:26:43
我的困惑部分源於使用腳手架來生成一個資源將attr_accessible添加到模型中。我感到驚訝的是,創建遷移以添加新字段並未更新模型.... – 2013-05-09 16:21:23
'attr_accessible'是大規模分配白名單。想象一下,如果Rails爲模式添加了諸如'admin'之類的東西,Rails會自動更新它! – mikeryz 2013-05-09 16:32:16