ikeike443のブログ

ソフトウェアビジネスに関心がある系のブログ

Salat(play-salat)で日付型のカラムにJodaTimeを使う方法

Play Scala でアプリを作る際、データベースにMongoDBを採用するってのは、結構ある話かなと思います。
PlayでMongoDBを使おうと思うと、play-salat を使うことになると思います。SalatはMongoDB用のORMです。

SalatでJoda Timeを使う方法をメモ書きしておきます。

下記をインポートするといいです。

  RegisterConversionHelpers() 
  RegisterJodaTimeConversionHelpers() 

Salat、というかPlay-Salatを使う場合、下記のようなパッケージオブジェクトを作っておくと思うのですが、

package models

import com.novus.salat.dao._
import com.novus.salat.annotations._
import com.mongodb.casbah.Imports._
import com.mongodb.casbah.commons.conversions.scala.{RegisterConversionHelpers, RegisterJodaTimeConversionHelpers}

import com.novus.salat.{ TypeHintFrequency, StringTypeHintStrategy, Context }
import play.api.Play
import play.api.Play.current

package object mongoContext {
  RegisterConversionHelpers()
  RegisterJodaTimeConversionHelpers() 

  implicit val context = {
    val context = new Context {
      val name = "global"
      override val typeHintStrategy = StringTypeHintStrategy(when = TypeHintFrequency.WhenNecessary, typeHint = "_t")
    }
    context.registerGlobalKeyOverride(remapThis = "id", toThisInstead = "_id")
    context.registerClassLoader(Play.classloader)
    context
  }
}

上記のように、この中に宣言してやるといいです。

あとは各モデルクラスの中で、下記のようにパッケージオブジェクトをインポートしてやればいい感じにJodaTimeを使えます。

package models

import play.api.Play.current
import org.joda.time.DateTime
import com.novus.salat._
import com.novus.salat.annotations._
import com.novus.salat.dao._
import com.mongodb.casbah.Imports._
import se.radley.plugin.salat._

import mongoContext._

case class Hoge(fuga: String, baz: String, date: DateTime)

object Lead extends ModelCompanion[Hoge, ObjectId] {
  val dao = new SalatDAO[Hoge, ObjectId](collection = mongoCollection("Hoge")) {}

  def findOneByVisitorId(fuga: String): Option[Hoge] = dao.findOne(MongoDBObject("fuga" -> fuga))
}