• 作成日時:
  • 更新日時:

EsqueletoのilikeでYesodのTextareaを検索する

やりたいこと

YesodのTextarea型で保存しているフィールドをEsqueletoのilike関数で検索したい.

なぜそのままだとダメなのか

  1. ilikeSqlStringのインスタンスを要求していてTextareaはそのインスタンスじゃないから
  2. ilikeの右辺がTextだから型が一致してないとダメ

なんでTextじゃなくてTextareaをモデルに保存したの

ユーザのtextareaを保存する場所で,複数回編集が行われることが予想されたので復元が容易なTextarea型にしました.今は少し後悔しています.

プログラム側で変換かけるのが難しい理由

Valueはファンクターですが,Esqueleto query expr backend => exprはファンクターでは無いため,簡単に内部を編集することができない.

SqlStringのインスタンスを用意すれば良いのでは

右辺と左辺を合わせなければダメ.

castStringを使えば?

なるほど,SqlStringのインスタンスを定義して,castStringを併用すれば可能ですね.

instance E.SqlString Textarea where
E.castString $ record E.^. recordMarkdown

できた

というわけで何もかもが雑ですが簡易的な検索機能が実装できました.

最適化はコンテンツが増えてきたらやれば良いのでやってないです.

デプロイはコードレビュー待つので来週やります.