2010-02-20 82 views
9

我正在重構一個基於Rails的事件註冊應用程序,該應用程序具有一個結帳過程,可以擊中多個ActiveRecord模型。理想情況下,除非結賬完成(付款已成功處理),否則不應保存這些對象。我不完全確定爲什麼暫時將這些對象序列化到會話中會是一件壞事,但我一遍又一遍地閱讀了它的不好的mojo。至少不存在與現有記錄不同步的風險,因爲不存在任何現有記錄。如果不在會話中,如何臨時存儲ActiveRecord對象?

我的問題是:

A)是不是還是有問題的會話中所存儲記錄,即使它們並不存在於其他地方?即使我修改模型,我是不是可以殺死所有現有的會話?

B)如果可能導致問題,我應該如何臨時存儲對象?我應該保存它們並使用布爾標誌來指示永久狀態還是臨時狀態?然後cron腳本來清除過時的臨時對象?

想法?

回答

5

爲什麼你不把它們存儲在數據庫中,但以一種你知道它們是「不完整」的方式?

例如,您可以添加一個added_to_cart_at日期時間字段。將產品添加到購物車時,保存該記錄並設置該字段的值。然後,如果用戶完成購買,則清除該字段,並將產品與訂單關聯。

要清除陳舊記錄,您可以設置每日cron刪除added_to_cart_at年齡大於1.day.ago的所有記錄。

+0

我認爲這是要走的路。從概念上講,使用該模型對我來說很有意義。臨時的,尚未生效的數據不應該在數據庫中,對嗎?但實際上,我可以看到它沒有意義,這種解決方案將更加強大。感謝您的輸入。 – tacomachine 2010-02-21 20:01:34

1

將它們存儲在會話中的問題是會話空間有限。存儲在會話中時,ActiveRecord對象在空間方面會帶來很多開銷。如果你存儲的人口密集has_many關係的記錄,你會遇到麻煩。

我相信Simone Carletti關於在數據庫中存儲部分記錄的描述是最好的解決方案。

但是,如果您確實想要在會話中存儲對象,請存儲儘可能少量的信息。例如只有ids和更新的字段。還將信息存儲爲散列,而不是直接將對象存儲在會話中。

+0

是的,我認爲如果您必須使用會話,這是一條路。我曾經考慮的是將部分記錄存儲在數據庫中,但只通過會話使用將各自的user_id與部分記錄的ID相關的散列將其與用戶相關聯。我相信這會起作用,但它會不必要地依賴會話。 Simone的解決方案應該做同樣的事情,但更好。 – tacomachine 2010-02-21 20:07:24