Fix eager loading a Rails app with performs
in an associated object
#14
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
ActiveJob::Performs was being included in an after_initialize hook, which was after the models were loaded, which means that an associated object that has a
performs
call in it had noperforms
method.This triggered the method_missing to run and find the
performs
method on the ActiveRecord model, use that, and then attempt to call my associated object name on the return value.Given this code:
performs
didn't exist, so it'd callAudioTrack.performs :sync
, which returns :sync_later. Then the method_missing code would attempt to run:sync_later.listening_plan_day_syncer
and error.By moving this on_load hook out of
after_initialize
, I now have aperforms
method when eager loading.I think the only reason it was working before is because the models were being lazy loaded, so I didn't attempt to call
performs
until long after boot.Note: I'm unsure how to test this. The problem only occurs when eager loading.