A barebones session store which duck-types with the default session store but bypasses Active Record and issues SQL directly. This is an example session model class meant as a basis for your own classes.
The database connection, table name, and session id and data columns are configurable class attributes. Marshaling and unmarshaling are implemented as class methods that you may override. By default, marshaling data is
::Base64.encode64(Marshal.dump(data))
and unmarshaling data is
Marshal.load(::Base64.decode64(data))
This marshaling behavior is intended to store the widest range of binary
session data in a text
column. For higher performance, store
in a blob
column instead and forgo the Base64 encoding.
- C
- D
- F
- L
- N
- S
- T
[W] | connection | Use the ActiveRecord::Base#connection by default. |
[W] | connection_pool | Use the ActiveRecord::Base.connection_pool by default. |
[W] | data | |
[R] | new_record | |
[R] | new_record? | |
[R] | session_id |
The data field defaults to ‘data’.
Look up a session by id and unmarshal its data if found.
# File activerecord/lib/active_record/session_store.rb, line 220 def find_by_session_id(session_id) if record = connection.select_one("SELECT * FROM #{@@table_name} WHERE #{@@session_id_column}=#{connection.quote(session_id)}") new(:session_id => session_id, :marshaled_data => record['data']) end end
Look for normal and marshaled data, self.find_by_session_id’s way of telling us to postpone unmarshaling until the data is requested. We need to handle a normal data attribute in case of a new record.
The session id field defaults to ‘#session_id’.
The table name defaults to ‘sessions’.
Lazy-unmarshal session state.
# File activerecord/lib/active_record/session_store.rb, line 260 def save return false unless loaded? marshaled_data = self.class.marshal(data) connect = connection if @new_record @new_record = false connect.update " INSERT INTO #{table_name} ( #{connect.quote_column_name(session_id_column)}, #{connect.quote_column_name(data_column)} ) VALUES ( #{connect.quote(session_id)}, #{connect.quote(marshaled_data)} ) ", 'Create session' else connect.update " UPDATE #{table_name} SET #{connect.quote_column_name(data_column)}=#{connect.quote(marshaled_data)} WHERE #{connect.quote_column_name(session_id_column)}=#{connect.quote(session_id)} ", 'Update session' end end