How to clear ActiveRecord query cache on associations with dynamic table

In part of my application I’m using dynamic tables. I’m aware of the single thread conditions. I’ve tackled some caveats yet - will post a blog about it soon - but there’s one I need help with.

Consider 2 models that are associated: Order and OrderLine where Order has many order_lines.

Now we set the table names for them:
Order.table_name=‘v1_orders’
OrderLine.table_name=‘v1_order_lines’

Query: OrderLine.joins(:order).where(Order.table_name=>{:customer_id=>1}).all
Result: Select v1_order_lines.* FROM v1_order_lines INNER JOIN v1_orders ON v1_orders.id=v1_order_lines.order_id WHERE v1_orders.customer_id=1

So far so good

Now we alter the table names:
Order.table_name=‘v2_orders’
OrderLine.table_name=‘v2_order_lines’

and requery:

Query: OrderLine.joins(:order).where(Order.table_name=>{:customer_id=>1}).all
Result:
Select v2_order_lines.* FROM v2_order_lines INNER JOIN v1_orders ON v1_orders.id=v2_order_lines.order_id WHERE v2_orders.customer_id=1

Notice the INNER JOIN, it still uses the v1_ prefixes!!

I looks like if there has been some association caching. How can I get rid of it?

I tried: ActiveRecord::Base.connection.schema_cache.clear! but without the right effect.

Thanks

Model.uncached do
  Model.do.work
end

Unfortunately the Model.uncached block does not work.

I tried ActiveRecord::Base.connection.disable_query_cache!
and
ActiveRecord::Base.connection.clear_query_cache
without any luck.

So, it’s not the query cache. It looks like some sort of association cache. Anyone suggestions?

We are doing something similarly crazy as well, you might try:

    ActiveSupport::Dependencies::Reference.clear!

I had to dig deep within the bowels of Active Support for that one :slight_smile:

Thanks! I might need that.

There was another caveat I ran into: Active Record subclasses. They do not derive their table name dynamically from their parent class

javinto wrote in post #1097693:

Unfortunately the Model.uncached block does not work.

I tried ActiveRecord::Base.connection.disable_query_cache!
and
ActiveRecord::Base.connection.clear_query_cache
without any luck.

So, it's not the query cache. It looks like some sort of association
cache.
Anyone suggestions?

It seems I have the exact same problem. Have you found a solution?

Thanks for your help!

Unfortunately not. We redesigned the whole concept. Certainly not ideal, but that was the only way around.

I did not try it out in Rails 4 though which might be worth a try.

Good luck!

Jan Verhoek wrote in post #1116383:

Unfortunately not. We redesigned the whole concept. Certainly not ideal,
but that was the only way around.

I did not try it out in Rails 4 though which might be worth a try.

Good luck!

Op 23 jul. 2013, om 17:51 heeft Arnaud M. <lists@ruby-forum.com> het
volgende geschreven:

Ok, thanks for your answer. I'll try to work around, definitely need
some luck on this one!