Object
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.
# File lib/active_record/session_store.rb, line 211 211: def connection 212: @connection ||= ActiveRecord::Base.connection 213: end
# File lib/active_record/session_store.rb, line 215 215: def connection_pool 216: @connection_pool ||= ActiveRecord::Base.connection_pool 217: end
The data field defaults to ‘data’.
# File lib/active_record/session_store.rb, line 199 199: cattr_accessor :data_column
Look up a session by id and unmarshal its data if found.
# File lib/active_record/session_store.rb, line 220 220: def find_by_session_id(session_id) 221: if record = connection.select_one("SELECT * FROM #{@@table_name} WHERE #{@@session_id_column}=#{connection.quote(session_id)}") 222: new(:session_id => session_id, :marshaled_data => record['data']) 223: end 224: 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.
# File lib/active_record/session_store.rb, line 237 237: def initialize(attributes) 238: @session_id = attributes[:session_id] 239: @data = attributes[:data] 240: @marshaled_data = attributes[:marshaled_data] 241: @new_record = @marshaled_data.nil? 242: end
The session id field defaults to ‘session_id’.
# File lib/active_record/session_store.rb, line 193 193: cattr_accessor :session_id_column
Lazy-unmarshal session state.
# File lib/active_record/session_store.rb, line 245 245: def data 246: unless @data 247: if @marshaled_data 248: @data, @marshaled_data = self.class.unmarshal(@marshaled_data) || {}, nil 249: else 250: @data = {} 251: end 252: end 253: @data 254: end
# File lib/active_record/session_store.rb, line 284 284: def destroy 285: return if @new_record 286: 287: connect = connection 288: connect.delete DELETE FROM #{table_name} WHERE #{connect.quote_column_name(session_id_column)}=#{connect.quote(session_id)}, 'Destroy session' 289: end
# File lib/active_record/session_store.rb, line 256 256: def loaded? 257: @data 258: end
# File lib/active_record/session_store.rb, line 260 260: def save 261: return false unless loaded? 262: marshaled_data = self.class.marshal(data) 263: connect = connection 264: 265: if @new_record 266: @new_record = false 267: 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' 268: else 269: 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' 270: end 271: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.