Я хотел бы отобразить список элементов на веб-странице вместе со связанными данными из отдельной таблицы (с отношением «много-к-одному»). Как это сделать в Yesod? Я использую стандартные леса. Результатом является то, что runDB
не может быть вложен в контексте WidgetT
— или около того я думаю.Как объединить «детали» из отдельного запроса в списке в Гамлете?
Чтобы сделать это более конкретным, как я определить функцию featuresAssociatedWith
использовать в следующем сельце код:
<h2> Cars
$forall Entity carId car <- carList
<div class="car-item">
<h3> #{carYear car} #{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] []
Хотя я уважаю поиск db-запросов из кода hamlet, мне показалось странным, что он будет вообще ограничен в виджетах. Помимо этого, мне просто интересно, есть ли «волшебный» способ сделать это в «Yesod» или «persistent». В конце концов я сделаю [это] (http://stackoverflow.com/a/9389550/712526). Спасибо за ваше время. – jpaugh
Я не сказал, что вы не можете сделать это в виджете, только не внутри Гамлета. Вы можете использовать [handlerToWidget] (http://hackage.haskell.org/package/yesod-core-1.2.19.2/docs/Yesod-Core-Widget.html#v:handlerToWidget) для преобразования любого действия обработчика в действие виджета , –