#ruby-on-rails #ruby #caching
#ruby-on-rails #ruby #кэширование
Вопрос:
Я пытаюсь реализовать кэширование информации о роли, начиная с входа в систему и выхода из системы.
В моих моделях / role.rb у меня есть это:
class Role < ApplicationRecord
belongs_to :user, optional: true
accepts_nested_attributes_for :user
class << self
def all_cached
Rails.cache.fetch("roles") { Role.where(user_id: current_user) }
end
end
private
def flush_cache
Rails.cache.delete('roles')
end
В моих контроллерах / roles_controller.rb у меня есть это:
def roles
@roles = Role.all_cached
end
В моих контроллерах / sessions_controller.br У меня есть это:
class SessionsController < ApplicationController
def new
render :layout => "empty"
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user amp;amp; user.authenticate(params[:session][:password])
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_back_or user
else
flash.now[:error] = 'Invalid email/password combination!'
render 'new', :layout => "empty"
end
end
def destroy
log_out if logged_in?
redirect_to login_path
end
end
Как мне установить, что роль current_user кэшируется при входе в систему и удаляется при выходе из системы?Я хочу кэшировать ее один раз за весь сеанс пользователя, чтобы в любое время получить информацию для проверки ролей и разрешений пользователей. Я не хочу хранить эту информацию в сеансе, так как в ней довольно много информации не уверен, безопасно ли это.
Комментарии:
1. Я не уверен, имеет ли это смысл. Что произойдет, если одновременно подключено несколько пользователей?
2. @spickermann Несколько пользователей будут входить в систему с разными ролями одновременно. Я думал, что должна быть возможность каким-то образом кэшировать роли каждого пользователя, а затем проверять их, когда это необходимо в приложении, чтобы определить, к чему пользователь может получить доступ и что он может делать.
3. Интересно, почему вы хотите кэшировать роль пользователя. Текущий пользователь в любом случае загружается из базы данных при каждом запросе, и я предполагаю, что чтение этого простого запроса из кэша (например, memcached или redis) не должно быть намного быстрее, чем чтение роли из базы данных напрямую, когда это необходимо.
4. @spickermann Я подумал, что если роль кэшируется, для проверки роли потребуется меньше запросов во всем приложении. Вероятно, я слишком много думаю 🙂 У меня есть рабочее решение, которое проверяет роль пользователя для каждого раздела приложения. Как вы думаете, я должен выполнять политики с помощью Pundit и все?
5. Является ли этот запрос серьезным узким местом в производительности вашего приложения? Если это так, вам нужно выяснить, почему. Если нет, не пытайтесь оптимизировать этот простой запрос. Преждевременная оптимизация — корень всего зла (Дональд Кнут)