18

Вопрос по ruby-on-rails-3, ruby-on-rails – Как очистить таблицу сессий рельсов

Я использую активное хранилище записей для хранения сессий рельсов.

В течение короткого времени, размерsessions стол сильно увеличился. Как эти строки сеанса сбрасываются после определенного периода времени. Или я должен вручную очистить их один раз в 24 часа?

4ответа

22

Хороший пост в блоге о вашей проблеме:http://blog.brightbox.co.uk/posts/clearing-out-rails-sessions

Решение состоит в том, чтобы создать пользовательскую задачу граблей:

task :clear_expired_sessions => :environment do
    sql = 'DELETE FROM sessions WHERE updated_at < DATE_SUB(NOW(), INTERVAL 1 DAY);'
    ActiveRecord::Base.connection.execute(sql)
end

... и запускайте его каждый день с помощью cron.

6

Когда вы звонитеreset_session rails удалит эту строку из таблицы сеансов. Однако не каждая сессия будет иметьreset_session вызывается: если пользователь закрывает свой браузер, не выходя из системы, браузер отбрасывает cookie-файл сеанса, поэтому строка сеанса больше никогда не будет использоваться, ноreset_session не будет называться.

Rails не прояснит, что для вас накапливается фуфло - вы сами можете вести уборку на нем так, как считаете нужным. В предыдущем задании мы использовали для запуска cronjob, который удалял старые строки сеанса.

32

Используйте стандартный вызов ActiveRecord в Rails 3.2. Для даты передайте значение, соответствующее длине вашего & quot; Запомнить меня & quot; продолжительность. В моем примере это очистит ВСЕ сеансы, которые были неактивными в течение двух недель.

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", 2.weeks.ago])

Как указано @journeyer ниже, при использовании драгоценного камня Devise можно ссылаться на Devise & apos; конфигурации.

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", Devise.remember_for.ago])

При использовании драгоценного камня волшебства можно ссылаться на конфигурацию волшебства.

ActiveRecord::SessionStore::Session.delete_all(["updated_at < ?", User.sorcery_config.remember_me_for.ago])
0

Я бы порекомендовал очистить ваши сессии рельсов, используя работу cron или что-то. Может быть, не 24 часа, зависит от того, как долго вы хотите, чтобы пользовательские сессии были доступны. Rails предоставляет для этого грабли

rake db:sessions:clear

RelatedQuestions