3

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?

Harsh Gupta
  • 4,348
  • 2
  • 25
  • 30
  • how and where are you extending `ActiveRecord::Base` with `LoadSamples`? – André Barbosa Feb 19 '14 at 11:06
  • I have edited my post and added the missing piece. I created a file in `config/initializers` called `extensions.rb` and added `ActiveRecord::Base.extend BaseSample::LoadSamples` to it. – Harsh Gupta Feb 19 '14 at 11:23
  • any ideas from anyone? I am kinda stumped here. – Harsh Gupta Feb 19 '14 at 19:56
  • 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 guess why `LoadSamples` loaded the first time properly but not the second time? – Harsh Gupta Feb 21 '14 at 09:26
  • The answer here may help you: http://stackoverflow.com/a/23008837/149503 – stereoscott Oct 27 '14 at 04:54

0 Answers0