Вопрос

How do you build a unique key with two or more fields using the persistLowerCase quasiquoter?

When using Database.Persist to create models for a simple website using guidance from the Yesod book, the following error crops up:

Build FAILED
$PREFIX/App/Models.hs: line 42, column 18:
  Not in scope: data constructor `GroupSlug'
$PREFIX/App/Models.hs: line 43, column 19:
  Not in scope: data constructor `GroupName'

App/Models.hs

{-# LANGUAGE EmptyDataDecls       #-}
{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE GADTs                #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE QuasiQuotes          #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE TypeFamilies         #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module App.Models where

import           Data.Text                    (Text)
import           Database.Persist.TH

share [ mkPersist sqlSettings
      , mkMigrate "migrateAll"] [persistLowerCase|
Post
    group          GroupId
    postName       Text
    postSlug       Text
    period         Text
    content_en     Text
    content_pt     Text
    UniquePost     postSlug
    deriving Show
Group
    groupId      Int
    groupName    Text
    groupSlug    Text
    parent       GroupId
    UniqueGroup  groupId groupSlug
    deriving Show
|]

App/Handlers.hs

{-# LANGUAGE OverloadedStrings #-}
module App.Handlers where

import           Database.Esqueleto
import           App.Models

groupQuery x =
    select $
    from $ \g -> do
    where_ (g ^. GroupSlug ==. val x)
    return $ g ^. GroupName

Versions:

  • Haskell Platform 2013.2
  • Cabal == 1.19.2
  • persistent == 1.3.0.2
  • scotty == 0.6.2
  • esqueleto == 1.3.4.5

Am I missing some extension or overlooking something else?

Это было полезно?

Решение

As far as I'm aware, data constructors that you're trying to use are actually called GroupGroupSlug and GroupGroupName (not just GroupSlug and GroupName). That is because the data type is generated by taking the entity name and joining it with the field name (with proper capitalisation). Try loading your source files with the -ddump-splices command-line parameter, and you should see it in the output somewhere.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top