Использование rails Presenters - незабываемый устаревший в 3.1 - используйте вместо этого ||=?
Проблема: по возможности избегать создания нескольких объектов или нескольких запросов.
Я использую Presenters с рельсами в качестве лучшей практики.
Я следую совету, который говорит, что было бы хорошо использовать "extension ActiveSupport.Memoizable" (и затем memoize: метод (ы) для их использования) над настройкой элементов с @the_record = record ||= @record
стиль из-за нескольких проблем - ложь или ноль не сохраняются, поэтому запрос вызывается снова, а также то, что запоминаемый лучше использует кеш (то есть использует его!).
Тем не менее, я вижу, что запоминающееся становится устаревшим в рельсах 3.1 Примечания i github под carrierwave и с утверждением: "ПРЕДУПРЕЖДЕНИЕ ОБ УСТРОЙСТВЕ: ActiveSupport::Memoizable устарело и будет удалено в будущих выпусках, вместо этого просто используйте шаблон запоминания Ruby". /Users/kain/.rvm/gems/ruby-1.9.3-preview1/bundler/gems/carrierwave-c4459179b0f8/lib/carrierwave/mount.rb:284".
Может быть, это решено, хотя? Кто-нибудь знает?
Какие-либо предложения о лучшей практике для использования в будущем? Использовать синтаксис ||=? Как насчет вышеуказанных вопросов?
1 ответ
||=
Метод отлично подходит для вещей, которые возвращают значения, которые оцениваются как истинные, но он не очень хорошо работает для вещей, которые этого не делают. memoize
действительно работает вокруг этого, захватывая эти условия и возвращаясь соответственно. Вы можете использовать такой подход, если вы хотите приспособиться nil
:
def some_method
return @some_method if (instance_variable_defined?(:"@some_method"))
@some_method = begin
...
end
end
Это просто проверяет, определена ли переменная, а не установлена ли она, что является важным отличием в вашем случае.
Я не уверен, почему вы думаете, что это устарело [Примечание Майкла, оно устарело в 3.2, см. Примечание ниже]. Документация указывает, что это все еще актуально в 3.1. Иногда реализации помечаются как "устаревшие", когда они перемещаются из одного модуля в другой, но средство остается доступным.