In mid July 2008 Memoization was added to Rails core. A demonstration of the usage is here.
I have not been able to find any good examples on when methods should be
I think many Rails developers don't fully understand what memoization does and how it works. I've seen it applied to methods that return lazy loaded collections (like a Sequel dataset), or applied to methods that take no arguments but calculate something based on instance variables. In the first case the memoization is nothing but overhead, and in the second it's a source of nasty and hard to track down bugs.
I would not apply memoization if
There are other situations too where memoization isn't appropriate, such as the one in the question and the answers above, but these are three that I think aren't as obvious.
The last item is probably the most important: memoization caches a result based on the arguments to the method, if the method looks like this it cannot be memoized:
def unmemoizable1(name)
"%s was here %s" % name, Time.now.strftime('%Y-%m-%d')
end
def unmemoizable2
find_by_shoe_size(@size)
end
Both can, however, be rewritten to take advantage of memoization (although in these two cases it should obviously not be done for other reasons):
def unmemoizable1(name)
memoizable1(name, Time.now.strftime('%Y-%m-%d'))
end
def memoizable1(name, time)
"#{name} was here #{time}"
end
memoize :memoizable1
def unmemoizable2
memoizable2(@size)
end
def memoizable2(size)
find_by_shoe_size(size)
end
memoize :memoizable2
(assuming that find_by_shoe_size didn't have, or relied on, any side effects)
The trick is to extract a pure function from the method and apply memoization to that instead.