How can I extend a module to a model class and use an instance of a custom class as a class instance variable for model such that when next request comes, custom class could be found and older instances are deleted?
This works in production mode or when I set config.cache_classes
to true
. Following is the idea:
/lib/base_sample/load_samples.rb
module BaseSample
module LoadSamples
attr_accessor :samples
def load_samples
@samples ||= Samples.new
# ..some work
@samples
end
end
end
/lib/base_sample/samples.rb
module BaseSample
class Samples
...
end
end
I extend LoadSamples
to ActiveRecord::Base
.
/config/initializers/extensions.rb
ActiveRecord::Base.extend BaseSample::LoadSamples
/app/models/user.rb
class User < ActiveRecord::Base
load_samples
end
The first page loads correctly, but subsequent requests gives following error:
ArgumentError in UsersController#new
A copy of BaseSample::LoadSamples has been removed from the module tree but is still active!
and points to line:
@samples ||= Samples.new
Full Stacktrace
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:414:in `load_missing_constant'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:80:in `rake_original_const_missing'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rake-0.9.2.2/lib/rake/ext/module.rb:36:in `const_missing'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/lib/base_sample/load_samples.rb:10:in `load_validation_rules_from_file'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/app/models/user.rb:2
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:380:in `load_without_new_constant_marking'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:380:in `load_file'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:521:in `new_constants_in'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:379:in `load_file'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:259:in `require_or_load'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:425:in `load_missing_constant'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:80:in `rake_original_const_missing'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rake-0.9.2.2/lib/rake/ext/module.rb:36:in `const_missing'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:92:in `const_missing'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:437:in `load_missing_constant'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:96:in `const_missing'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/app/controllers/users_controller.rb:27:in `new'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:1331:in `send'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:1331:in `perform_action_without_filters'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/filters.rb:617:in `call_filters'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/filters.rb:610:in `perform_action_without_benchmark'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/benchmark.rb:308:in `realtime'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activesupport-2.3.8/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/rescue.rb:160:in `perform_action_without_flash'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/flash.rb:151:in `perform_action'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:532:in `send'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:532:in `process_without_filters'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/filters.rb:606:in `process'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:391:in `process'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/base.rb:386:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/routing/route_set.rb:438:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:87:in `dispatch'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:121:in `_call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:130:in `build_middleware_stack'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/query_cache.rb:29:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/query_cache.rb:29:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/query_cache.rb:9:in `cache'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/query_cache.rb:28:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/activerecord-2.3.8/lib/active_record/connection_adapters/abstract/connection_pool.rb:361:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/string_coercion.rb:25:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/head.rb:9:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/methodoverride.rb:24:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/params_parser.rb:15:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/session/cookie_store.rb:99:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/failsafe.rb:26:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/lock.rb:11:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/lock.rb:11:in `synchronize'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/lock.rb:11:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:114:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/reloader.rb:34:in `run'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/actionpack-2.3.8/lib/action_controller/dispatcher.rb:108:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rails-2.3.8/lib/rails/rack/static.rb:31:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/urlmap.rb:47:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/urlmap.rb:41:in `each'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/urlmap.rb:41:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rails-2.3.8/lib/rails/rack/log_tailer.rb:17:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/content_length.rb:13:in `call'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/handler/webrick.rb:48:in `service'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/server.rb:162:in `start'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/server.rb:95:in `start'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/server.rb:92:in `each'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/server.rb:92:in `start'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/server.rb:23:in `start'
/home/harsh/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/webrick/server.rb:82:in `start'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rack-1.1.6/lib/rack/handler/webrick.rb:14:in `run'
/home/harsh/Documents/works/rails/v238/grp_validations_yml/vendor/ruby/1.8/gems/rails-2.3.8/lib/commands/server.rb:111
script/server:3:in `require'
script/server:3
Any inputs on how to improve this so that I can work on it in dev-mode?
I am using Rails 2.3.8.
EDIT: Well, I dug deep into ActiveSupport::Dependencies
and after few hours of debugging found out that Object
could not find a constant named BaseSamples::LoadSamples
. I removed the file extensions.rb
, basically removed the line where I extended ActiveRecord::Base
and directly extended User
model. That way it worked.
Can anyone explain why LoadSamples
loaded the first time properly but not the second time?