Очевидно, что ||=
не будет работать
def x?
@x_query ||= expensive_way_to_calculate_x
end
потому что если он окажется false
или nil
, то expensive_way_to_calculate_x
будет запущен снова и снова.
В настоящее время лучшим способом, который я знаю, является значение Array
:
def x?
return @x_query.first if @x_query.is_a?(Array)
@x_query = [expensive_way_to_calculate_x]
@x_query.first
end
Есть ли более обычный или эффективный способ сделать это?
ОБНОВЛЕНИЕ. Я понял, что мне хотелось memoize nil
в дополнение к false
- это все возвращается к https://rails.lighthouseapp.com/projects/8994/tickets/1830-railscachefetch-does-not-work-with-false-boolean-as-cached-value - мои извинения Эндрю Маршалл, которые дали совершенно правильный ответ.