2014-09-01 11 views
2

웹 페이지에 항목 목록을 표시하고 관련 테이블과 관련된 세부 정보 (다 대일 관계 포함)를 표시하고 싶습니다. Yesod에서 나는 이것을 어떻게합니까? 기본 스캐 폴딩을 사용하고 있습니다. 결과적으로 runDBWidgetT 컨텍스트 내에서   —으로 중첩 될 수 없기 때문에 생각합니다. 햄릿의 목록에서 별도의 쿼리의 "세부 정보"를 결합하는 방법은 무엇입니까?

이보다 구체적인하려면, 나는 다음과 같은 작은 마을 코드에서 사용하는 기능 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

햄릿은 당신이 그것의 내부 데이터베이스 쿼리 등의 작업을 수행 할 수 없습니다 수 있도록 설계되었습니다. 대신 hamlet 외부에서 쿼리를 수행 한 다음 관련 테이블의 데이터와 함께 자동차 정보의 튜플 목록을 전달해야합니다.

+0

hamlet 코드에서 db lookup을 유지하는 것을 존중하지만 위젯에서 발생하는 것으로 제한된다는 것이 이상하다는 것을 알게되었습니다. 그 외에도 "Yesod"또는 "persistent"에서이 작업을 수행하는 "마법의"방법이 있는지 궁금합니다. 나는 결국 [this] (http://stackoverflow.com/a/9389550/712526)을 끝낼 것이다. 시간 내 주셔서 감사합니다. – jpaugh

+1

나는 햄릿 안의 위젯에서 할 수 없다고 말하지 않았다. Handler 액션을 위젯 액션으로 변환하려면 [handlerToWidget] (http://hackage.haskell.org/package/yesod-core-1.2.19.2/docs/Yesod-Core-Widget.html#v:handlerToWidget)을 사용할 수 있습니다. . –