diff --git a/lib/active_record/session_store.rb b/lib/active_record/session_store.rb index 4f56c5e..2ca91a8 100644 --- a/lib/active_record/session_store.rb +++ b/lib/active_record/session_store.rb @@ -8,6 +8,9 @@ module ActiveRecord module SessionStore autoload :Session, 'active_record/session_store/session' + @disable_sessid_fallback = false + singleton_class.attr_accessor :disable_sessid_fallback + module ClassMethods # :nodoc: mattr_accessor :serializer diff --git a/lib/active_record/session_store/session.rb b/lib/active_record/session_store/session.rb index aec3253..2276868 100644 --- a/lib/active_record/session_store/session.rb +++ b/lib/active_record/session_store/session.rb @@ -22,19 +22,19 @@ def data_column_size_limit @data_column_size_limit ||= columns_hash[data_column_name].limit end - # Hook to set up sessid compatibility. - def find_by_session_id(session_id) - SEMAPHORE.synchronize { setup_sessid_compatibility! } - find_by_session_id(session_id) - end - - private - def session_id_column - 'session_id' + if SessionStore.disable_sessid_fallback + def find_by_session_id(session_id) + where(session_id: session_id).first + end + else + # Hook to set up sessid compatibility. + def find_by_session_id(session_id) + SEMAPHORE.synchronize { setup_sessid_compatibility! } + find_by_session_id(session_id) end # Compatibility with tables using sessid instead of session_id. - def setup_sessid_compatibility! + private def setup_sessid_compatibility! # Reset column info since it may be stale. reset_column_information if columns_hash['sessid'] @@ -52,6 +52,12 @@ def self.find_by_session_id(session_id) end end end + end + + private + def session_id_column + 'session_id' + end end def initialize(*) diff --git a/test/session_test.rb b/test/session_test.rb index e49c76d..37366a3 100644 --- a/test/session_test.rb +++ b/test/session_test.rb @@ -108,6 +108,36 @@ def self.session_id_column Session.reset_column_information end + def test_find_by_sess_id_compat_disabled + old_fallback = ActiveRecord::SessionStore.disable_sessid_fallback + ActiveRecord::SessionStore.disable_sessid_fallback = true + + # Force class reload, as we need to redo the meta-programming + ActiveRecord::SessionStore.send(:remove_const, :Session) + load 'active_record/session_store/session.rb' + + Session.reset_column_information + klass = Class.new(Session) do + def self.session_id_column + 'sessid' + end + end + klass.create_table! + + assert klass.columns_hash['sessid'], 'sessid column exists' + session = klass.new(:data => 'hello') + session.sessid = "100" + session.save! + + assert_raises(ActiveRecord::StatementInvalid) do + klass.find_by_session_id("100") + end + ensure + klass.drop_table! + Session.reset_column_information + ActiveRecord::SessionStore.disable_sessid_fallback = old_fallback + end + def test_find_by_session_id Session.create_table! session_id = "10"