rails应用程序中的会话太多

时间:2015-10-10 20:49:06

标签: ruby-on-rails ruby ruby-on-rails-4 rubygems

我正在从头开始在ruby上建立一个电子商务网站。(这是我在轨道上的第一个Ruby项目)

我的产品属于子类别,而子类别又属于某个类别。

我的过滤器部分包括多个复选框,用于类别,子类别,additional_category(如手工制作的衣服,工厂建造等),生活方式(放松,公司等)和cloth_material_type(此处有 30个选项

我将每个案例的 5个数组发送到后端以搜索关联。

现在,当未登录的用户重新加载页面时,用户设置的过滤器会重置为默认值

为了避免这种情况,我有四个选择。

选项1 。将用户设置的过滤器值存储在快速的 Cookie 中。但这可能会降低用户浏览器的速度。

选项2 。使用 ActiveRecord :: SessionStore gem将值存储在会话中,这会将我的会话大小增加到65K,但会降低应用程序的速度。

选项3 。使用jquery 修改/创建document.url 选项,以便每个过滤器选项都附加到document.url并在重新加载时获取参数设置用户进行过滤。但这看起来非常麻烦。

选项4 。使用像 rails临时数据库

的宝石

我选择使用选项2并使用会话存储,但我认为将来维护它会变得很麻烦。

只需要一些建议,比如其他rails电子商务网站为解决这个问题做了什么,或者有更好的方法来解决这个问题。

1 个答案:

答案 0 :(得分:0)

<强> Redis的

我要做的是添加一层抽象;具体而言,我认为您可以使用Redis或类似的临时数据库(正如您在问题中提到的那样)。

Redis是一个key:value数据库,它基本上存储了JSON值,供您在应用中使用。如果将其绑定到模型,您将能够存储临时值而不会妨碍应用程序的性能。

我认为您可以设置Redis来存储来宾ID,以及您的值数组:

[guest_user_id] => [
    1 => "x"
    2 => "y"
    3 => ["z", "a", "b"]
]

初始化guest_user_id系统时,您可以生成Redis,并将其存储在用户的session中。这样,您只需在用户的浏览器中存储最少的数据,并可以使用Redis数据填充各种控制器操作:

#config/routes.rb
resources :categories do
   resources :subcategories
end

#app/models/user.rb
Class User < ActiveRecord::Base
    def self.new_data
       # create guest_id and send to Redis
    end
end

如果用户未注册,您可以使用guest_id 填充会话:

#app/controllers/products_controller.rb
class ProductsController < ApplicationController
    def show
        @user = user_signed_in? ? current_user : User.new_data
        #You'll then be able to populate their Redis values with the data from the product selection etc
    end
end 

我可以进一步详细说明,但由于你只是在寻找建议,这就是我现在要推荐的内容