Railsでsession storeにactive_recordを使う方法と型の注意点(特にフォームが多い時とかに)

Pocket

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となっています。

rb:config/initializers/session_store.rb

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

 だそうです。

これでエラーはでなくなりました。
あとはマイグレート実行して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

 

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください