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
ActiveSupport::Base64.encode64(Marshal.dump(data))
and unmarshaling data is
Marshal.load(ActiveSupport::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.
Use the ActiveRecord::Base.connection by default.
# File lib/active_record/session_store.rb, line 183 183: cattr_accessor :connection
# File lib/active_record/session_store.rb, line 207 207: def connection 208: @@connection ||= ActiveRecord::Base.connection 209: end
The data field defaults to ‘data’.
# File lib/active_record/session_store.rb, line 200 200: cattr_accessor :data_column
Look up a session by id and unmarshal its data if found.
# File lib/active_record/session_store.rb, line 212 212: def find_by_session_id(session_id) 213: if record = connection.select_one("SELECT * FROM #{@@table_name} WHERE #{@@session_id_column}=#{connection.quote(session_id)}") 214: new(:session_id => session_id, :marshaled_data => record['data']) 215: end 216: 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 227 227: def initialize(attributes) 228: @session_id = attributes[:session_id] 229: @data = attributes[:data] 230: @marshaled_data = attributes[:marshaled_data] 231: @new_record = @marshaled_data.nil? 232: end
The session id field defaults to ‘session_id’.
# File lib/active_record/session_store.rb, line 194 194: cattr_accessor :session_id_column
Lazy-unmarshal session state.
# File lib/active_record/session_store.rb, line 235 235: def data 236: unless @data 237: if @marshaled_data 238: @data, @marshaled_data = self.class.unmarshal(@marshaled_data) || {}, nil 239: else 240: @data = {} 241: end 242: end 243: @data 244: end
# File lib/active_record/session_store.rb, line 274 274: def destroy 275: return if @new_record 276: 277: connect = connection 278: connect.delete DELETE FROM #{table_name} WHERE #{connect.quote_column_name(session_id_column)}=#{connect.quote(session_id)}, 'Destroy session' 279: end
# File lib/active_record/session_store.rb, line 246 246: def loaded? 247: @data 248: end
# File lib/active_record/session_store.rb, line 250 250: def save 251: return false unless loaded? 252: marshaled_data = self.class.marshal(data) 253: connect = connection 254: 255: if @new_record 256: @new_record = false 257: 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' 258: else 259: 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' 260: end 261: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.