У меня есть класс, в котором поиск экземпляра стоит дорого, поэтому экземпляры кэшируются:
class Foo
def self.find(id)
Rails.cache.fetch("Foo.#{id}") do
// some expensive lookup, like an HTTParty request, or a long SQL query
...
end
end
end
Это прекрасно работает, пока Foo
s не связали Foo
s:
class Foo
def children
@child_foo_ids.map { |id| Foo.find(id) }
end
end
Я бы хотел использовать ||=
кэширование для сохранения повторных поездок:
class Foo
def children
@children ||= @child_foo_ids.map { |id| Foo.find(id) }
end
end
Но Rails.cache
замораживает найденные Foo
s, поэтому я не могу установить переменную экземпляра после создания и кэширования объекта. (то есть этот метод поднимает TypeError
.)
Одним из решений будет предварительная выборка parent
, когда я впервые сделаю дорогую находку, но это может закончиться загрузкой гигантского графа объектов, когда мне нужен только один или два экземпляра. *