データベースのセッションデータを削除する

Railsでセッションをデータベースに格納するのはよくある話と想うのだけど、これのきれいな掃除の仕方他が見当たらなかったので、ちょっとメモ

いつも通り環境はいかのとおり

  • Rails2.1.2
  • Ruby1.8.6 P287

configに書いているSessionをDatabaseに格納する定義は以下の通り。

config.action_controller.session_store = :active_record_store

Rakeで削除する機能を探してみると以下の物があった

#rake db:sessions:clear

これをRAILS_ROOTで起動すると確かにデータベース上のセッション情報は消えるのだけど、これはきれいさっぱり消えてしまう。接続中だろうが何だろうが消えてしまうのでこれは悲しい。

バッチで一定時間より古いものを消したいのだけど、どうするのがうまいのかよくわからないが以下のような物を作ってみた。

#mkdir RAILS_ROOT/crons
#touch delsession.rb

このファイルの中には以下のような感じで書いた

@target_days = 3 #指定日付より前のセッションを削除する
#セッションのモデルを宣言
class Session < ActiveRecord::Base
end
#セッション削除
Session.delete_all(["updated_at<?",(Time.new - @target_days.days)])

あとは、これを定期的に呼べばいいので適当なシェルファイルを作ってみる。

#!/bin/bash
cd RAILS_ROOT #ここは環境に応じて書き換える
/usr/local/bin/ruby ./script/runner 'eval(IO.readlines("./crons/delsession.rb").join)'

これで定期的に削除処理が実行出来る。これが正しい動きなのかどうなのかよくわからないけど、目的は達せられそうな感じ。