简体   繁体   中英

Too many sessions in a rails application

I am building an E-commerce website on ruby on rails from scratch.(This is my first project on ruby on rails)

My product belongs to a subcategory which in-turn belongs to a category.

My filters partial include multiple check-boxes for category,subcategory,additional_category(Like hand made clothes,factory built etc.),lifestyle(relaxed,corporate etc) and cloth_material_type(this has around 30 options )

I am sending 5 arrays for each of these cases to the backend to search through the associations.

Now when a non logged in user reloads the page the filters set by user resets to default .

To avoid this I have four options in mind.

Option 1 . Store the filter values set by the user in the cookies which is fast.But it might slow down the user's browser.

Option2 . Store the values in a session using ActiveRecord::SessionStore gem which will increase the size of session for me to 65K but would slow down the application.

Option 3 .Using jquery modify/create document.url options so that every filter option gets appended to the document.url and on reload I get the parameters set by the user for filtering.But this looks very cumbersome to implement.

Option 4 . Using gems like rails temporary database etc.

I have opted with option 2 and using session store for the purpose but I think that it will become cumbersome to maintain this in the future.

Just need some suggestions like what do other rails ecommerce websites do to solve this problem or is there any better way to solve this.

Redis

What I'd do is add a layer of abstraction; specifically I think you'd benefit from using Redis , or similar temporary db (as you alluded to in your question).

Redis is a key:value database, which basically stores JSON values for you to use within your app. If you tie it to a model, you'll be able to store temporary values without hindering your app's performance.

I think you could setup Redis to store a guest id, and an array of your values from that:

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

You'd be able to generate the guest_user_id when you initialize the Redis system, and store it in the user's session . This way, you're only storing minimal data inside your user's browser, and can populate the various controller actions with Redis data:

#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

This will allow you to populate a session with your guest_id if the user is not registered:

#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 

I could go into more specifics, but as you're only looking for suggestions, this is what I have to recommend at the moment

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM