【问题标题】:How to store ActiveRecord object in session using Rails?如何使用 Rails 在会话中存储 ActiveRecord 对象?
【发布时间】:2012-09-14 03:45:05
【问题描述】:

我正在为我的网站构建一个购物车,但我在使用 rails 会话时遇到了问题,并且 ActiveRecord 对象:

Shopping Cart 实际上是一个带有一些 OrderItem 的 Order 对象。

将 Order 对象添加到会话后,Dalli 开始引发此异常:

Marshalling error for key 'sessions:9e67886e826819a3213df4f4c89db6e0': can't dump hash with default proc
You are trying to cache a Ruby object which cannot be serialized to memcached.
/home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/server.rb:277:in `dump'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/server.rb:277:in `serialize'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/server.rb:164:in `set'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/server.rb:48:in `request'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/options.rb:18:in `block in request'
    /home/rodrigo/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/options.rb:17:in `request'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/client.rb:251:in `perform'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/dalli/client.rb:120:in `set'
    /home/rodrigo/.rvm/gems/ruby-1.9.3-p125@netsabe-ecommerce/gems/dalli-2.1.0/lib/action_dispatch/middleware/session/dalli_store.rb:50:in `set_session'

谷歌搜索,我发现 ActiveRecord 不能存储在会话中。

那么,在会话中存储这些对象的最佳方式是什么? 我必须为这些类实现序列化/反序列化方法吗?

谢谢!

编辑 1:

记住 Order 对象还没有持久化!

【问题讨论】:

    标签: ruby-on-rails ruby session web


    【解决方案1】:

    在会话中存储对象是个坏主意。
    Storing Objects in a Session in Rails
    最好存储对象的id,这样您就可以随时检查对象是否处于最新状态。

    【讨论】:

    • 好的,但是 Order 对象还没有保存在数据库中。
    • @Rodrigo:它不必被持久化,只要你想到一个 AR 对象,你就会得到一个默认的 proc:stackoverflow.com/a/6392704/479863
    • 但这将始终运行数据库查询..如果我将对象存储到会话中,我将保存该查询..?!
    猜你喜欢
    • 2017-02-27
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多