Ich versuche, die cached
Funktion zu verwenden, um mehr db-Abfragen in verschiedenen Widgets und Handler zu verhindern:Wie kann man pro Cachespeicherung von Yesod pro Anfrage arbeiten?
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
Und in einem Widget irgendwo:
renderDerp :: Widget
renderDerp = do
--these are used in the shakespeare files
lolBob <- handlerToWidget $ getBob
nutherBob <- handlerToWidget $ getBob
$(widgetFile "test")
Dies kompiliert, aber die Abfrage die bekommen Die ID wird immer noch mehrfach ausgeführt.
Was mache ich falsch? Oder gibt es einen besseren Weg, nur einmal Bob zu bekommen und ihn in jedem Handler und Widget zu benutzen?
Ich habe Code in der Frage nicht wirklich gelesen (da ich auch ein Problem mit 'cached' hatte). Jemand wird wirklich leicht 200 Punkte bekommen. – Cthulhu