如何结合"细节"来自哈姆雷特列表中的单独查询?

时间:2014-09-01 00:54:52

标签: haskell yesod persistent hamlet

我想在网页中显示项目列表,以及来自单独表格的关联详细信息(具有多对一关系)。我如何在Yesod中做到这一点?我正在使用默认的脚手架。结果是runDB不能嵌套在WidgetT上下文中 - 或者我认为。

为了使其更具体,如何定义要在以下hamlet代码中使用的函数featuresAssociatedWith

<h2> Cars

$forall Entity carId car <- carList
    <div class="car-item">
        <h3> #{carYear car}&nbsp;#{carMake car} #{carModel car}
        <ul>
            $forall feature <- featuresAssociatedWith carId
                <li> #{feature}

鉴于以下模型:

Car
    make        Text
    model       Text
    year        Int

CarFeature
    car         CarId
    text        Text
    UniqueCF    car text

这是当前的处理函数

getCarListR :: Handler Html
getCarListR = do
        carList <- runDB $ selectList [] [Asc CarOrder]
        liftIO $ print $ length carList
        defaultLayout $ do
            setTitle "Cars"
            $(widgetFile "carList")

以这种方式在Widget中嵌入runDB查询似乎是最自然的,但同样,这是不可能的:

featuresAssocWith :: CarId -> [Entity CarFeature]
featuresAssocWith carID = selectList [CarFeatureCar ==. carID] []

1 个答案:

答案 0 :(得分:2)

Hamlet旨在不允许您在其中执行数据库查询等操作。相反,您需要在哈姆雷特之外执行查询,然后传递汽车信息元组列表以及相关表格中的数据。