Railsでsessionをactive_recordを使って管理をするときにちょっとデータベースの型で詰まったのでメモします。
環境
Ruby 2.1.2
Rails 4.1.6
MySQL
+-------------------------+----------+
| Variable_name | Value |
+-------------------------+----------+
| version | 5.6.21 |
| version_comment | Homebrew |
| version_compile_machine | x86_64 |
| version_compile_os | osx10.10 |
+-------------------------+----------+
activerecord-session_store
gem activerecord-session_store
を入れる。Gemfileに追記してbundle install
します。
gem 'activerecord-session_store'
active_recordをsession_storeに設定
次にsession_store.rbで:active_record_storeを設定します。デフォルトでは:cookie_storeとなっています。
Railsapp::Application.config.session_store :active_record_store, key: '_railsapp_session'
マイグレーション
セッションを管理するテーブルを作ります。
bundle exec rails generate active_record:session_migration
class AddSessionsTable < ActiveRecord::Migration
def change
create_table :sessions do |t|
t.string :session_id, :null => false
t.text :data, limit: 4294967295
t.timestamps
end
add_index :sessions, :session_id, :unique => true
add_index :sessions, :updated_at
end
end
マイグレーションファイルが作られますがここで自分の環境ではですが注意すべきことありました。最初、dataカラムを普通にtext型だけでやっていたのですが、それだとフォームが多すぎるせいか以下のエラーが頻発しました。データが大きすぎるそうです。
Data too long for column '' at row 1
なので、MySQLのlongtext型をつかうためにtextにlimitを設定しました。
t.text :data, limit: 4294967295
ちなみに
1 to 255 bytes: TINYTEXT
256 to 65535 bytes: TEXT
65536 to 16777215 bytes: MEDIUMTEXT
16777216 to 4294967295 bytes: LONGTEXT
だそうです。
こうしたらエラーはでなくなりました。
あとはmigrate実行してOKです。
bundle exec rake db:migrate
再起動はしといてください。
参考
Rails4でsession storeをActiveRecordに変更 | EasyRamble
http://easyramble.com/rails-active-record-session-store.html
Rails 3 Migration with longtext - Stack Overflow
http://stackoverflow.com/questions/4443477/rails-3-migration-with-longtext