2014-09-01 3 views
2

Я хотел бы отобразить список элементов на веб-странице вместе со связанными данными из отдельной таблицы (с отношением «много-к-одному»). Как это сделать в Yesod? Я использую стандартные леса. Результатом является то, что runDB не может быть вложен в контексте WidgetT   — или около того я думаю.Как объединить «детали» из отдельного запроса в списке в Гамлете?

Чтобы сделать это более конкретным, как я определить функцию 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") 

Кажется наиболее естественным внедрить runDB запрос в виджете этот путь, но опять же, это не представляется возможным:

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

ответ

2

Гамлет предназначен не позволяют выполнять действия, такие как запросы к базам данных внутри него. Вместо этого вам нужно будет выполнить запрос за пределами деревни, а затем передать список кортежей информации о машине вместе с данными из связанной таблицы.

+0

Хотя я уважаю поиск db-запросов из кода hamlet, мне показалось странным, что он будет вообще ограничен в виджетах. Помимо этого, мне просто интересно, есть ли «волшебный» способ сделать это в «Yesod» или «persistent». В конце концов я сделаю [это] (http://stackoverflow.com/a/9389550/712526). Спасибо за ваше время. – jpaugh

+1

Я не сказал, что вы не можете сделать это в виджете, только не внутри Гамлета. Вы можете использовать [handlerToWidget] (http://hackage.haskell.org/package/yesod-core-1.2.19.2/docs/Yesod-Core-Widget.html#v:handlerToWidget) для преобразования любого действия обработчика в действие виджета , –

 Смежные вопросы

  • Нет связанных вопросов^_^