2011-04-01 22 views
55

下面是我有一個集成測試的一部分:如何知道何時在Rails中「刷新」我的模型對象?

user = User.first 
assert !user.is_active? 

get confirm_email_user_url(user),:confirmId => user.mail_confirmation_hash 

assert_equal response.status,200 
# because confirm_email_user_url modifies the activation state of the object 
user = User.first 
assert_equal user.state,"activated" 

我度過的最後一個小時的調試這個:)。在我的初始版本中,在confirm_email_user_url被訪問後,我沒有重新初始化user,並且即使用戶被激活,狀態也始終爲inactive

如何知道我是否應該「重新加載」(缺少更好的名稱)模型對象?我應該怎麼打電話才能這樣做?

+2

確實,重新加載是合適的術語,你可以使用user.reload – apneadiving 2011-04-01 23:13:22

+1

可能是有用的:http://www.alexanderinteractive.com/blog/2009/02/tip-reloading-activerecord-instances/ – apneadiving 2011-04-01 23:19:11

回答

111

只要數據庫中的數據發生變化,您就需要致電user.reload

在上面的代碼中,「用戶」對象是通過User.first從數據庫中獲取的數據在內存中創建的。然後,看起來您的confirm_email_user_url修改了數據庫。直到你從reload中重新獲取數據庫中的數據,該對象才知道這個。

我不確定是否有程序化的方式來知道什麼時候需要重新加載對象,但作爲開發人員,您應該知道正在發生的事情並正確處理。在我的大部分經驗中(這是有限的),這只是測試過程中的一個問題。在生產中,在數據庫加載到內存中時,數據庫中的對象不會被修改。通常發生的情況是修改內存中的對象,然後將其保存到數據庫(即,user.email = "[email protected]"後跟user.save)。我想如果你有一個高活動的應用程序,很多用戶可能會在短時間內連續修改某些內容,那麼你應該小心一點。

+0

我不'不明白,'user = User.first','User.first'不會再次觸發查詢?它應該自動重新加載?沒有? – GMsoF 2016-12-15 08:18:09

5

Btw。當你在模型上做東西時,這不起作用,如Report.count。之後重置列信息或獲得第一個/最後一個記錄的實例,並重新加載它幫助我在重新連接計數之間的數據庫這樣的唯一的無盡嘗試:

initial_count = Report.count 

# do something, like invoking a rake task that imports the reports, .. 

Report.connection.reconnect! 
final_count = Report.count 

這個工作對Rails的2.3。 8+,我不知道3 +版本。

+0

對於我的特殊用例(多個請求訪問相同的數據,然後一個請求更新數據,第二個請求嘗試獲取更新),相當於user.reload無效,但Report.connection.reconnect!工作。 – SWoo 2015-06-25 02:43:57

相關問題