YesodではPersistentと言うORMを使って気軽にモデルを定義し、そして使用することが出来ます、しかも型安全に、です。
Yesodではmodelの定義はconfig/modelsと言うファイルに書くのがお決まりですが、さて、ココで「自分の定義した型をモデルに使いたい」と言う時に少しハマったのでメモります。
まず、Model.hsファイルに定義した型の書いてあるパッケージをimport
します。ここで例えばData.DateTime
などだと事前にYesod側で定義してくれているのかスムーズに使えるのですが、完全なる自前の型を使いたいという時に「これは使えない型だよ、適切に型クラスのinstance
にしてね」とエラーが出ます。
その型クラスと言うのはPersistField
なのですが、これのinstance
を手で書くのは手間です、いや、そんなに手間でもないっぽいですけど、やっぱり手間です。
と言う需要のための便利機能がもちろんあって、それはderivePersistField
です。
よしじゃあ早速これを使って
--いろいろ
import UserModule ( UserDefineType )
derivePersistField "UserDefineType"
--いろいろ
としてやれば……あれ? なんかエラーが出ますね……。
どうやらModel.hs内でderivePersistField
を使うとエラーになるようです。
じゃあどないすりゃええねん! と奮闘した結果、以下のようになりました
module Helper where
import Database.Persist.TH
import UserModule ( UserDefineType )
derivePersistField "UserDefineType"
--色々
import UserModule ( UserDefineType )
import Helper ( )
--色々
こうしてやれば良いようです、要するに
- Model.hs内に
derivePersistField
を直接書かず、別のファイルにderivePersistField
を書いてそれをimport
しろ
ということのようです
なおこれはこれで警告が出るのですが、まあ、仕方がないね。
何でこんな仕様なんだろう、と思いつつ、まあ、仕方が無い感じなので、皆さんコケたらこうやって対処しましょう、無駄なファイルとimport
が増えるようですが仕方が無いです。
読んでいただきありがとうございました、では。