2013-04-25 23 views
8

Bu yüzden/config/modellerim şunun gibi görünüyor. Persistent Yesod'da çoktan çoğa yapmanın en iyi yolu nedir?

Person 
    name Text 
Car 
    name Text 
PersonCar 
    personId PersionId eq 
    carId CarId eq 
    UniquePersonCar personId carId 

veritabanında girişler, sırasıyla Person "Superman" Car "SUV" Car "Ford" Person "Batman" olduğunu varsayın.

Şu anda bunları İşleyicimde bağlamak için yapıyorum.

runDB $ do 
    person <- selectFirst [PersonName ==. "Batman"] [] 
    car <- selectFirst [Carname ==. "SUV"] [] 
    let Entity personId _ = case person of 
          Just info -> infor 
          Nothing -> error "no such Person" 
    let Entity carId _ = case car of 
          Just info -> infor 
          Nothing -> error "no such Car" 
    _ <- insert $ PersonCar personId carId 

Bunu yapmanın daha kolay bir yolu var mı? Böyle bir ifade yapmak için bir sözleşme var mı?

cevap

1

Hayır, şu anda bu tür bir sorgu için bir kestirme yok (en azından düşünebildiğim).

1

hata çağrıları, uygulamanızı durdurur. logError daha iyi olabilir. Bir işleyici altında yapıyorum

import Data.Conduit 
import qualified Data.Conduit.List as DCL 

runDB $ do 
    mbPersonId <- runResourceT $ selectKeys [PersonName ==. "Batman"] [] $$ DCL.head 
    mbCarId <- runResourceT $ selectKeys [CarName ==. "SUV"] [] $$ DCL.head 

    case (mbPersonId, mbCarId) of 
     (Just personId, Just carId) -> do 
       _ <- insert $ PersonCar personId carId 
       return() 

     _ -> $(logError) "error looking for Batman and SUV" 
+0

, o beni hatayı ayrıştırmak herhangi bir fikir veriyor:

Bu kısadır? 'postFromR :: Handler RepHtml postFormR FormSuccess res ait vaka sonucunu do = -> _ <- runDB $ insert $ PersonCar persionId carId _ -> $ (logError) "hata"' – HHC

+0

@HHC, Eklediğim bir Daha sonra bir dönüş ifadesi gerektiren, ekleme satırının çevresini bloke edin. Bir yesod kurulumu ile test edilmiştir, kodu tekrar alın. Model adlarınızı kontrol edin (PersonId yerine PesionId, Personon yerine PesonCar) –

İlgili konular