2015-02-05 4 views
3

Я пытаюсь создать таблицу многих из многих, используя Groundhog в Haskell, которая в основном выглядит так, если я отрежу всю оставшуюся логику:Каков идеальный способ выбора строк проецируемыми клавишами в Groundhog Haskell

data FooRow = FooRow { 
    fooRowUUID :: UUID 
} 
deriving instance Show FooRow 

data BarRow = BarRow { 
    barRowUUID :: UUID 
} 
deriving instance Show BarRow 

data FooToBarRow = FooToBarRow { 
    fooToBarRowUUID :: UUID, 
    fooToBarRowFoo :: DefaultKey FooRow, 
    fooToBarRowBar :: DefaultKey BarRow 
} 
deriving instance Show FooToBarRow 

Теперь, пытаясь определить операции, я могу получить и вставить все эти записи просто отлично, но я не уверен, как идти от наличия FooRow, с его ID, а затем получить все соответствующие курганы по многим таблицам. Сейчас я играл с чем-то вроде этого:

getBarsForFoo fooID = do 
    barKeys <- project 
    (FooToBarRowBarField) 
    (FooToBarRowFooField ==. (Foo_FooKey fooID)) 
    select $ (BarRowUUIDField `in_` barKeys) 

Однако это не typecheck с ошибкой:

Couldn't match type 'UUID' with 'BarRow' 

инспектирующих только результаты проекта с putStrLn, я могу видеть, что тип barKeys является:

[Bar_BarKey UUID] 

, но я не совсем понимаю, как использовать, что в моем запросе. Я не вижу таких примеров в документации Groundhog, поэтому я надеюсь, что кто-то сможет поставить меня на правильный путь здесь.

ответ

1

Я вполне уверен, что есть более эффективные способы решения этого вопроса (с этим подходом будет множество базовых запросов), но это, по крайней мере, выполнит эту работу на данный момент.

getBarsForFoo fooID = do 
    barKeys <- project 
     (FooToBarRowBarField) 
     (FooToBarRowFooField ==. (Foo_FooKey fooID)) 
    q <- mapM (getBy) barKeys 
    return (catMaybes q :: [BarRow]) 
Смежные вопросы