LoginSignup
5
5

More than 5 years have passed since last update.

Yesodのmodelで好きな型をフィールドの型に使えるようにしたい

Posted at

 YesodではPersistentと言うORMを使って気軽にモデルを定義し、そして使用することが出来ます、しかも型安全に、です。
 Yesodではmodelの定義はconfig/modelsと言うファイルに書くのがお決まりですが、さて、ココで「自分の定義した型をモデルに使いたい」と言う時に少しハマったのでメモります。
 まず、Model.hsファイルに定義した型の書いてあるパッケージをimportします。ここで例えばData.DateTimeなどだと事前にYesod側で定義してくれているのかスムーズに使えるのですが、完全なる自前の型を使いたいという時に「これは使えない型だよ、適切に型クラスのinstanceにしてね」とエラーが出ます。
 その型クラスと言うのはPersistFieldなのですが、これのinstanceを手で書くのは手間です、いや、そんなに手間でもないっぽいですけど、やっぱり手間です。
 と言う需要のための便利機能がもちろんあって、それはderivePersistFieldです。
 よしじゃあ早速これを使って

Model.hs
--いろいろ
import UserModule ( UserDefineType )
derivePersistField "UserDefineType"
--いろいろ

 としてやれば……あれ? なんかエラーが出ますね……。
 どうやらModel.hs内でderivePersistFieldを使うとエラーになるようです。
 じゃあどないすりゃええねん! と奮闘した結果、以下のようになりました

Helper.hs
module Helper where
    import Database.Persist.TH
    import UserModule ( UserDefineType )
    derivePersistField "UserDefineType"
Model.hs
--色々
import UserModule ( UserDefineType )
import Helper ( )
--色々

 こうしてやれば良いようです、要するに

 ということのようです
 なおこれはこれで警告が出るのですが、まあ、仕方がないね。
 何でこんな仕様なんだろう、と思いつつ、まあ、仕方が無い感じなので、皆さんコケたらこうやって対処しましょう、無駄なファイルとimportが増えるようですが仕方が無いです。

 読んでいただきありがとうございました、では。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5