Rails 2 caching?


#1

There’s a part of my code that really needs to get the latest value from
the database.

But AR in Rails 2 seems to have some kind of caching, so if I execute a
Model.find statement with the exact same arguments, it won’t go to the
database, it’ll just return the same value it got last time?

At least that’s the only way I can explain the weird behavior I am
seeing. This seems like rather an evil thing to turn on by default, but
at any rate, if I’m right about what’s going on… how do I disable this
for an individual Model.find command, where I really need to get fresh
data?

Jonathan


#2

On Dec 5, 3:37 pm, Jonathan R. <rails-mailing-l…@andreas-
s.net> wrote:

There’s a part of my code that really needs to get the latest value from
the database.

But AR in Rails 2 seems to have some kind of caching, so if I execute a
Model.find statement with the exact same arguments, it won’t go to the
database, it’ll just return the same value it got last time?

Actually, that’s only true during a single action (request-response
cycle). Once your action is over, the cache is cleared.

At least that’s the only way I can explain the weird behavior I am
seeing. This seems like rather an evil thing to turn on by default, but
at any rate, if I’m right about what’s going on… how do I disable this
for an individual Model.find command, where I really need to get fresh
data?

You should always be getting new data. If you need to get fresh data
within an action,
you can reload the model.

@order.reload

or

@order.products(true) # reloads associated products collection

Jonathan

Posted viahttp://www.ruby-forum.com/.

Hope that helps?

Jeff

www.purpleworkshops.com


#3

That does help, thanks. Sometimes I need fresh data within an action
even. Or for my tests–should the sql querries be cached during tests?
Is the semantics for what is cached when documented anywhere?

I also discovered “ModelName.uncached do”, which is helpful. But
@individual_model.reload is good too, along with
@individual_model.reset–although I’m not sure #reset will actually
prevent re-use of the sql cache upon reload.

Some documentation of all this stuff would be really helpful, if anyone
who understands it for sure wants to write some.

Jeff C. wrote:

Actually, that’s only true during a single action (request-response
cycle). Once your action is over, the cache is cleared.

You should always be getting new data. If you need to get fresh data
within an action,
you can reload the model.

@order.reload

or

@order.products(true) # reloads associated products collection