如何从yesod中的处理程序中提取模型中的信息?

时间:2014-09-22 17:19:30

标签: entity monads yesod

我的问题是如何从查询结果列表中提取每个实体Post的年份。

我的模特是这样的:

Post
    name Text
    content Text
    date UTCTime default=CURRENT_TIME
    deriving Show

我的处理程序看起来像这样:

getYearR :: Integer -> Handler Html
getYearR year = do
    posts <- runDB $ selectList [] [Desc PostDate]
    years <- --some function with posts for extract the list of years
    defaultLayout $ do
        aDomId <- newIdent
        setTitle "Blog"
        $(widgetFile "homepage")

也许这个解决方案与关于monad的一些基本知识有关,但我不知道这种情况是如何工作的。

感谢您的时间,我非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

首先,我创建了一个便利功能来提取年份。我从Day获取UTCTime时引用these docs,从Day获取年份时引用these docs

import Data.Time

getYear :: UTCTime -> Integer
getYear time = 
    let (year,_,_) = toGregorian $ utctDay time
    in year

使用此功能,我可以使用entityValEntity中提取Haskell记录,使用UTCTime提取postDate,然后提取年使用我的getYear函数

let years = map (getYear . postDate . entityVal) posts

如果您使用的是哈姆雷特中的年份列表,则可以跳过创建中间years值并只迭代posts

<ul>
    $forall Entity id post <- posts
        <li>
            <h4>The year is #{getYear $ postDate post}</a>