3

私のconfig/modelsファイルが次のようになっているとしましょう:

Pet
    name Text
    owner OwnerId
Owner
    name Text

次のようにペットの名前を取得できます。

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

しかし、ペットエンティティから所有者の名前を取得するにはどうすればよいでしょうか?

言い換えれば、foo次の内容は次のとおりです。

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

1 に答える 1

4

Yesod は (例えば) Rails のようにリレーション用の関数を構築しないので、この種のものを自分で書く必要があります。

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

fooこれは Handler に返されることに注意してください (必要な DB クエリのために必要です)。つまり、補間で直接使用することはできませんでした。

あなたの例を文字通りに取ると、テンプレート内からそのアクションを実行することは、まさにあなたができると期待することです. これは通常、デザインの臭いであることを強調し、すべてのデータベース クエリをハンドラーで前もって実行し、テンプレートが必要とする (純粋な) 値を直接ハンドラーに渡すように、物事を再構築することをお勧めします。たとえば、[(Pet,Owner)]またはを構築して渡すことができます。[(Owner, [Pet])]

私のサイトの 1 つで、1 対多の関係について DB にクエリを実行し、最も便利な方法であると思われるタプルのリストを取得する一般的な方法を抽象化するヘルパーがいくつかあります。(parent, child)

お役に立てれば。

于 2013-02-01T20:27:59.840 に答える