2012-12-12 21 views
1

案例1:創建一個模型,一個新的記錄與分配相關聯的對象(狀態對象,而不是Status.id)像Rails - 如何使用重載方法?

visit = Visit.create(:date => Date.today, :status => Status.first) 
    visit.status_id #=> 1 

創建

我試圖更新的記錄後屬性'status_id'(Status.id而不是Status對象),但它返回舊值,甚至在保存對象後調用reload。例如:

visit.status_id = Status.last.id 
    visit.save 
    visit.reload 
    visit.status_id #=> 1 

當我調用重載方法之後創建工作正常

visit = Visit.create(:date => Date.today, :status => Status.first) 
    visit.status_id #=> 1 
    visit.reload 
    visit.status_id = 2 
    visit.save 
    visit.status_id #=> 2 

情況2:如果我分配「STATUS_ID的價值,而不是狀態對象,則無需重新加載對象和它的做工精細

visit = Visit.create(:date => Date.today, :status_id => Status.first.id) 
    visit.status_id #=> 1 
    visit.status_id = 2 
    visit.save 
    visit.status_id #=> 2 

使用上述兩種情況,當我應該使用reload方法?是否應該在save之前或之後?

回答

5

我認爲你對savereload工作的理解基本上是正確的。你的結果當然似乎不一致。我有一種根據你的結果感覺你的save失敗。

save會嘗試將本地版本存儲到數據庫。如果模型在加載後發生更改,它不會刷新數據庫中的任何值。如果save失敗,則本地值仍然是您設置的值,但數據庫將具有舊值值。

reload覆蓋您所做的任何本地更改並將它們設置爲數據庫值。

假設您關心的模型在數據庫中沒有爭用,讓我們來看看您的示例。

例1 如果save作品,那麼reload不會做任何與visit.status_id值將是Status.last.id。但是,如果save失敗,那麼visit.status_id的值將是數據庫最初的值。

例2 如果create不工作,然後因爲你還沒有被堅持不reload東西reload將給予RecordNotFound錯誤。之後,您將status_id設置爲2,然後致電save。如果save成功或失敗,status_id的本地值將保持爲2.但是,數據庫值取決於它是通過還是失敗。

實施例3 嘿!除了重新加載外,這與例2相同。

下面是一些文檔,但我不知道你將如何有幫助找到它: http://apidock.com/rails/ActiveRecord/Persistence/save

http://apidock.com/rails/ActiveRecord/Persistence/reload

您可能要檢查save成功或致電save!,以確保save實際上是加工。

我希望有幫助。

+0

感謝您的答案,根據我的例子1當我保存在控制檯中的記錄它返回true,也沒有任何錯誤的對象(表有新記錄),現在我正在更新值(不重新加載記錄),它不會更新,如果更新應該完成,我必須重新加載然後編輯該值,然後用新值更新記錄 – nishanthan