2014-01-21 16 views
3

假設我有我的ActiveRecord模型User類,和我保存會話內的用戶對象時,在用戶登錄(即session[:user] = user確保在Rails的模型的每個實例在內存中最多存在一次

在我的代碼中,我可能會從數據庫加載相同的用戶並更新它。

user = User.where(happy: false).first 
user.happy = true 
user.save 

但隨後在會話的用戶是不是最新的,因爲session[:user]是用戶在內存中的另一個實例的引用。

如果ActiveRecord查詢方法從內存中加載了User實例(如果可能的話),這可以解決問題,但爲了避免XY problem,解決此問題的更好方法是什麼? 當每個控制器運行時,重複刷新會話中的每個對象是否是最好的方法?我是否應該避免將對象存儲在會話中以支持對象ID?

+2

曾經有一個ActiveRecord的可選身份映射,但[「由於與關聯的某些不一致性,」Rails 4.0從Active Record刪除了身份映射「](http://edgeguides.rubyonrails.org/upgrading_ruby_on_rails.html#升級從 - 軌道-3-2至導軌-4-0-活性錄製)。我建議不要使用這樣的會話,如果你需要某個用戶,將它傳遞給調用鏈或者試圖確保用戶只能在最小的範圍內使用。 –

+0

你的意思是你會建議在需要的時候從數據庫加載用戶(例如,通過在會話中存儲它的id),而不是直接存儲對象? – Vortico

+0

或在控制器中使用通常的'current_user'方法。然後,如果您懷疑某人已經改變了背後的底層用戶,請手動「重新加載」它。我只將id放在任何持久化的東西中,並儘可能避免隱藏的全局變量(這是'session'甚至'current_user'的真實含義)。 –

回答

相關問題