ruby on rails 3 - ActiveRecord::ConfigurationError - Association named 'whatever' was not found -


i have complicated case i'm developing rails 3 engine , intermittently error in title. here's stacktrace:

activerecord::configurationerror - association named 'whatever' not found; perhaps misspelled it?:   activerecord (3.2.18) lib/active_record/associations/preloader.rb:150:in `block in records_by_reflection'   activerecord (3.2.18) lib/active_record/associations/preloader.rb:146:in `records_by_reflection'   activerecord (3.2.18) lib/active_record/associations/preloader.rb:139:in `grouped_records'   activerecord (3.2.18) lib/active_record/associations/preloader.rb:130:in `preload_one'   activerecord (3.2.18) lib/active_record/associations/preloader.rb:109:in `preload'   activerecord (3.2.18) lib/active_record/associations/preloader.rb:98:in `block in run'   activerecord (3.2.18) lib/active_record/associations/preloader.rb:98:in `run'   activerecord (3.2.18) lib/active_record/relation.rb:181:in `block in exec_queries'   activerecord (3.2.18) lib/active_record/relation.rb:180:in `exec_queries'   activerecord (3.2.18) lib/active_record/relation.rb:160:in `block in to_a'   activerecord (3.2.18) lib/active_record/explain.rb:41:in `logging_query_plan'   activerecord (3.2.18) lib/active_record/relation.rb:159:in `to_a'   activerecord (3.2.18) lib/active_record/relation/delegation.rb:39:in `+'   /users/me/src/appointment_engine/app/controllers/appointment_engine/appointments_controller.rb:42:in `block (3 levels) in index'   /users/me/src/appointment_engine/app/controllers/appointment_engine/appointments_controller.rb:41:in `block (2 levels) in index'   actionpack (3.2.18) lib/action_controller/metal/mime_responds.rb:196:in `respond_to'   /users/me/src/appointment_engine/app/controllers/appointment_engine/appointments_controller.rb:12:in `index' 

to summarize: there's model named appointment in engine polymorphically associated has_many :through host app's user model (this requirement because associate model). here's has_many declaration in appointment

class appointment < activerecord::base   has_many :scheduleables,     through: :appointments_scheduleables,     source_type: kae.scheduleable_class.name   has_many :schedulers,     through: :appointments_schedulers,     source_type: kae.scheduler_class.name end 

here ran first problem; need set :source_type on has_many :through polymorphic associations (it doesn't work without it) , need know class of associated model but, when engine's appointment model loads before host app's user model loads , therefore engine's module kae hasn't received value kae.scheduleable_class yet.

here's how kae receives value:

# in host app class user < activerecord::base   acts_as_scheduler end 

i wrote acts_as_scheduler ar mixin, declare has_many :through association appointment.

my first attempt fix this: put appointment's has_many declaration in hook inside railtie:

activesupport.on_load :after_initialize   kae::appointment.class_eval     has_many :scheduleables,       through: :appointments_scheduleables,       source_type: kae.scheduleable_class.name     has_many :schedulers,       through: :appointments_schedulers,       source_type: kae.scheduler_class.name   end end 

ok works, wait till host app loads , have values kae.scheduleable_class , kae.scheduler_class, great.

except error in title intermittently!

i can boot fine, use app while (10-30 mins) , out of boom! i've tried under rails server, thin, , unicorn; same must app/framework level bug. in active record preloader class top of stacktrace points to:

# lib/active_record/associations/preloader.rb:150 def records_by_reflection(association)   records.group_by |record|     reflection = record.class.reflections[association]      unless reflection       raise activerecord::configurationerror, "association named '#{association}' not found; " \                                               "perhaps misspelled it?"     end      reflection   end end 

how can model forget of it's associations?

so i'm doing directly in appointment model , seems working far it's ugly:

class appointment < activerecord::base   if kae.scheduler_class && kae.scheduleable_class     has_many :scheduleables,       through: :appointments_scheduleables,       source_type: kae.scheduleable_class.name     has_many :schedulers,       through: :appointments_schedulers,       source_type: kae.scheduler_class.name   else     binding.pry # todo     activesupport.on_load :after_initialize       kae::appointment.class_eval         has_many :scheduleables,           through: :appointments_scheduleables,           source_type: kae.scheduleable_class.name         has_many :schedulers,           through: :appointments_schedulers,           source_type: kae.scheduler_class.name       end     end   end end 

anybody know of better way of declaring has_many :through polymorphic associations in rails 3 engine?

i've been looking @ open source projects acts_as_taggable_on_steroids , paper_trail see how associations don't have polymorphic has_many :through.

anybody know projects have type of association?

load ordering can pain rails autoloading+auto-reloading magic. in these situations make dependencies more explicit. suggest try using rails's require_dependency in host ensure doesn't occur:

# in host app require_dependency 'appointment' class user < activerecord::base   acts_as_scheduler end 

it's activesupport's version of require plays development environment's auto-reloading, why you're experiencing issue intermittently when working on application.


Comments

Popular posts from this blog

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

php - render data via PDO::FETCH_FUNC vs loop -

The canvas has been tainted by cross-origin data in chrome only -