2016-06-12 36 views
1

Ich benutze Yesod und Postgresql, um eine einfache Webanwendung zu erstellen.Wie verwende ich eine UUID in Yesod?

Ich möchte, dass eines meiner Modelle UUID4 als Primärschlüssel anstelle einer inkrementellen Ganzzahl verwendet.

Ich habe versucht, this example zu folgen, aber ich konnte es nicht zur Arbeit bringen, und es verwendet Linsen und Prismen, die für etwas, das einfach sein sollte, zu fortgeschritten sein könnte.

Also, wie gebe ich einem Modell eine UUID für seine ID?

Antwort

2

Update: Siehe Chris Allen article zu diesem Thema.

ein Blog Modell als Beispiel:

Zuerst müssen wir unser uuid Feld und eine Einzigartigkeit Einschränkung auf diesem Feld hinzuzufügen, so dass wir unsere UUID eindeutig sein wird und Lookups werden schnell sein. Die in unserem Modell definierten Felder entsprechen den Feldern in unserer Anwendungsform.

-- config/models 

Blog 
    title Text 
    content Text 
    user UserId 
    createdAt UTCTime 
    uuid Text default=uuid_generate_v4() 
    UniqueUuid uuid 

Dann in unserem applicative Form importieren wir zwei Module, die uns die UUID Funktionen geben wir brauchen, und einen Wert entweder in einem monadischen oder applicative Stil extrahieren.

-- Handler/Home.hs 

import Data.UUID 
import Data.UUID.V4 

form :: UserId -> Form Blog 
form userId = renderDivs $ Blog 
    <$> areq textField "Title" Nothing 
    <*> areq textareaField "Contents" Nothing 
    <*> pure userId 
    <*> lift (liftIO getCurrentTime) 
    -- either use the following line (monadic style) 
    <*> lift (liftIO $ do { key <- nextRandom; return $ toText key }) 
    -- ...or use this style (applicative style) 
    <*> lift (fmap toText $ liftIO nextRandom) 

fragte ich einen hilfreichen Haskeller in einem IRC-Kanal, was der Unterschied zwischen den beiden Ansätzen war, und das war ihre Antwort:

Irgendwie gefällt mich persönlich die Monade Version mehr ... Aber es ist syntaktisch zu teuer, also in diesem Fall würde ich wahrscheinlich mit der fmap Version gehen ... aber wenn ich mehr Verarbeitung auf der UUID tun würde, würde ich definitiv die Monad-Version gehen, aber IO ist eine Monad-Klasse, so dass es auch Functor implementieren muss Typ Klasse ... Sie können denken, dass mit einem fmap ist mehr "Low-Level"

n.b. Möglicherweise müssen Sie die Erweiterung uuid-ossp in Ihrer Datenbank aktivieren. Sie können das tun, indem Sie CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; ausführen.