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