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