reset association cache for polymorphism


I have a product class with category and a polymorphic attributes details_info, that depending on category go to one or another table to get the detail

Class Product




Class DetailsInfo


Class Pencil

include DetailsInfo




Class Notebook

include DetailsInfo size


and to display products i do

prds = Products.all

prds.each do |pr|

if pr.category == ‘pencil’

DetailsInfo.table_name = ‘pencil’

else if pr.category == ‘notebook’

DetailsInfo.table_name = ‘notebook’



(this is just kind of algo I use)

All this was working fine but with rails > 4.2 , it doesnt work anymore.

The first time pr.details_info will be called, it seems that the table name is cached somewhere, and then all other products are using the same table_name. When I check during loop, I can see that DetailsInfo.table_name is always correct, but still when pr.details_info will be called , it used the first table_name that was used. I can also see that the method table_name is called every step of the loop, and it return the good table_name, but still, the sql request search on bad table.

How can I reset that ? Ive tried a lot a thing like emptying association_cache, also different things with reflect_on_all_associations, reset_column_information, reload, …


FWIW, you should take a look at the “Polymorphic Associations” section in the Guides: Active Record Associations — Ruby on Rails Guides My guess is that that functionality will allow you to avoid the `table_name` swapping that’s tripping up the code above.

But also note that this list is for development of the Rails framework, not for debugging individual applications. rails-talk is the correct place for this question.

—Matt Jones