2012-02-22 10 views
3

セイ、イェソド/永続的に、私が持っているモデルのセットアップそうのようなUserのs。これをどうやってやりますか?イェソド/固定の1対1のクエリ

私は結合について考えましたが、それは一対一ではありません(私はそれは問題ではないと思いますが、もっと簡単な解決策を望みます)。手動で参加をしていることもオプションですが、私はパフォーマンスが心配だ - 私は

questions <- runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10] 
let askerIds = map (\(Entity _ q) -> questionAsker q) questions 
askers <- sequence $ map (runDB . get) askerIds 
let questionsAndAskers = zip questions askers 

を持っているが、私はmaprunDBを使用して心配です(それがためにデータベースへの個別の要求をすることはないだろう各ユーザーは?)

これを達成するためのより良い/より慣用的な方法がありますか?

+0

はい私はあなたが 'runDB'を押すたびに別のデータベースクエリが実行されると仮定するのは公正だと思います。 –

答えて

6

私はまだこれを入力し、チェックしていないが、私はrunDBの内側全体のことを固執します:

runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10] >>= mapM (\[email protected](Entity _ q) -> do 
    asker <- get $ questionAsker q 
    return (qe, asker)) 
+0

永続的には、1の代わりにN + 1の選択がありますか? – Qrilka

+1

はい、処方されています。単一のクエリを使用する場合は、結合を使用する必要があります。そのためには、esqueletoの使用をお勧めします。 –

+0

ありがとうesqeletoは有望に見える – Qrilka

1

方法について:それはDB打つ必要がありますように思える

questions <- runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10] 
let askerIds = map (\(Entity _ q) -> questionAsker q) questions 
askers <- runDB $ selectList [UserId <-. askerIds] [] 
let questionsAndAskers = zip questions askers 

一度ユーザーのために。

+1

私が間違っていないと、2行目に「read askersIds = map(questionAsker。entityVal)questions」と書かれて読みやすくなりました。 –