Что-то вроде переменной $ или @@, но уникальное для каждого пользовательского сеанса. Рельсы - PullRequest
2 голосов
/ 31 октября 2011

У меня есть массив объектов.Я не могу сохранить его в БД по соображениям производительности.Я попытался сохранить массив в переменных Global ($ var) и Class (@@ var) (в контроллере), но это был один и тот же массив для всех пользователей.Он должен быть уникальным для каждого пользовательского сеанса, и в каждом сеансе он должен иметь возможность быстрого изменения.

Я понимаю, что сеанс [] - не лучшее решение.Какой самый лучший способ?

Я делаю что-то подобное $lines_rules << Processing::rule_creator(...) каждый раз, когда запускаю действие в контроллере.

$ lines_rules - это мой массив объектов.

Почему БД не подходит для магазина $ lines_rules?В $ lines_rules я храню объекты с лямбда-функцией.Когда пользователь нажимает кнопку, мне нужно вызвать каждую лямбда-функцию с помощью пользовательского ввода и сохранить результат.Затем я загружаю новые объекты в $ lines_rules.Таким образом, каждый запрос меняет $ lines_rules.Я думаю, что работа с памятью - лучший способ для производительности.

ОБНОВЛЕНИЕ

Я использую $global_hash [ session[:session_id] ] и этот метод для экономии ресурсов:

def dead_sessions_killer
  ActiveRecord::SessionStore::Session.where(["updated_at < ?", 30.minutes.ago]).each do |session|
    $global_hash.delete_if {|key, value| key == session.session_id }
    session.delete
  end
end

Ответы [ 3 ]

1 голос
/ 31 октября 2011

Использовать глобальный, но глобальный хеш-код, ключом которого является идентификатор сеанса пользователя.

Храните там все, что вы хотите, хотя с надлежащим кэшированием, трудно сказать, если это хорошая идея.

0 голосов
/ 01 ноября 2011

Вы можете сохранить сеанс пользователя в памяти с помощью memcache. Это было бы удобно и быстро.

http://awesomerails.wordpress.com/2011/08/23/rails-3-memcached-session-store/

0 голосов
/ 31 октября 2011

Вы можете объявить массив как переменную класса (только 1 @ знак) и предоставить метод доступа.

То есть:

class Foo

  @some_array

  def some_array
    @some_array
  end

end

Из других классов это позволяет вам вызывать foo_instance.some_array, который сохраняет массив, специфичный для пользователя, но разрешает публичный доступ из любого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...