【问题标题】:Too many sessions in a rails applicationRails 应用程序中的会话过多
【发布时间】:2015-10-10 20:49:05
【问题描述】:

我正在从头开始在 ruby​​ on rails 上构建一个电子商务网站。(这是我在 ruby​​ on rails 上的第一个项目)

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

我的过滤器部分包括多个复选框,用于类别、子类别、附加类别(如手工制作的衣服、工厂建造等)、生活方式(轻松、公司等)和布料_材料类型(这有大约 30 个选项)

我将针对每种情况发送 5 个数组到后端以搜索关联。

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

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

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

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

选项 3 .使用 jquery modify/create document.url 选项,以便每个过滤器选项都附加到 document.url 并在重新加载时我得到设置的参数用户进行过滤。但这看起来实现起来很麻烦。

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

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

只需要一些建议,例如其他 Rails 电子商务网站如何解决这个问题,或者有没有更好的方法来解决这个问题。

【问题讨论】:

  • 我会使用 url 参数,因为 restful 设计的原则之一是无论浏览器状态如何,资源都应该看起来相同。因此,如果我正在查看粉色女鞋并复制粘贴浏览器网址并将其发送给朋友,他们应该会看到相同的选择。
  • 您当然可以将它与 cookie/访客用户帐户一起使用来记住收藏夹。但是,由于无状态,构建面向 URL 的解决方案通常会更加健壮。
  • 感谢您的回复。N 正是我担心的问题..除了这些阵列之外,我还有价格范围和定制针迹选项可用。我正计划为临时数据创建一个搜索模型。这样用户就可以轻松地保存它们,如果他们愿意并分享他们保存的搜索。并将 cronjob 添加到 rake 任务以删除搜索模型和会话模型中的陈旧元组。

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


【解决方案1】:

Redis

我要做的是添加一个抽象层;具体来说,我认为您会受益于使用Redis 或类似的临时数据库(正如您在问题中提到的那样)。

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

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

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

您可以在初始化Redis 系统时生成guest_user_id,并将其存储在用户的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 

我可以说得更详细一些,但由于您只是在寻找建议,所以我现在必须推荐这个

【讨论】:

  • 非常感谢您的宝贵建议。我找到了另一种方法 - 使用 HTML5 本地存储,您可以在客户端保存大约 5 MB 的数据。(唯一的缺点是许多用户会使用旧版浏览器)。将您的答案标记为解决方案,添加抽象层肯定会在很多方面有所帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2016-06-16
  • 2012-05-20
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多