2013-02-01 1 views
3
마을

내에서 엔티티 값을 얻을 :yesod 지속 :의 내 설정/모델 파일은 다음과 같은 가정 해 봅시다

$forall Entity key pet <- pets 
    <span>#{petName pet} 

을하지만 난 방법을 얻을 것입니다 :이 같은 애완 동물의 이름을 얻을 수 있습니다

Pet 
    name Text 
    owner OwnerId 
Owner 
    name Text 

애완 동물 회사의 소유주 이름?

, foo 무엇을해야 다음 당신은 그냥 이런 종류의 작성있어 있도록

<span>#{ownerName $ foo $ petOwner pet} 

답변

4

Yesod는 관계 (예) 레일 수있는 방법을 기능을 구축하지 않습니다 너 스스로. 이 (그리고 필요한 DB 쿼리에 기인한다) 처리기에 반환

-- just one naive example 
petOwnerName :: Pet -> Handler (Maybe Text) 
petOwnerName p = do 
    mo <- runDB $ get (petOwner p) 
    return $ fmap ownerName mo 

공지 사항, 즉 당신이 보간에 foo으로 직접 사용할 수없는 것을 의미합니다.

예제를 그대로 사용하면 템플릿 내에서 해당 동작을 실행하는 것이 정확히 수행 할 수있는 작업입니다. 나는 이것이 보통 디자인 냄새라고 강조하고 싶다. 그래서 당신이 처리기에서 앞쪽으로 쿼리하는 모든 db를 수행 한 다음 템플리트가 직접 필요로하는 값 (순수한)을 전달하도록 작업 구조를 변경하는 것이 좋습니다. 예를 들어 [(Pet,Owner)] 또는 [(Owner, [Pet])]을 작성하여 전달할 수 있습니다.

일대 다 관계에 대해 DB를 쿼리하고 (parent, child) 같은 튜플 목록을 얻는 일반적인 방법을 추상화 한 내 사이트 중 하나에 helpers이 있습니다. 가장 유용한 방법이라는 것을 알았습니다.

희망이 도움이됩니다.

관련 문제