Я пытаюсь использовать функцию cached
, чтобы предотвратить несколько запросов в БД различных виджетов и обработчиков:Как использовать кэширование Yesod для каждого запроса?
newtype CachedBobId key
= CachedBobId { unCachedBobId :: key }
deriving Typeable
getBob' :: Handler BobId
getBob' = do
uncle <- runInputGet $ ireq textField "bobsuncle"
(Entity bob _) <- runDB $ getBy404 $ UniqueBob uncle
return bob
getBob :: Handler BobId
getBob = do
a <- getBob'
let b = return $ CachedBobId a
c <- cached b
return $ unCachedBobId c
И в виджете где:
renderDerp :: Widget
renderDerp = do
--these are used in the shakespeare files
lolBob <- handlerToWidget $ getBob
nutherBob <- handlerToWidget $ getBob
$(widgetFile "test")
компилируется, но запрос, чтобы получить ID все еще работает несколько раз.
Что я делаю неправильно? Или есть лучший способ только получить bob один раз и использовать его в каждом обработчике и виджетах?
Не действительно прочитал код внутри вопроса (так как у меня была проблема с 'cached' тоже). Кто-то получит очень легкие 200 очков. – Cthulhu