Создание специализированных полей в Lift's Record Framework - PullRequest
1 голос
/ 07 января 2012

Одним из приятных преимуществ Scala является то, что вы можете быть безопасными при вводе текста, чтобы в приложении не появлялись неопределенные значения. Монго, однако, не является типобезопасным вообще. Итак, я подумал, что лучше использовать своего рода преобразование в Mongo и обратно, чтобы гарантировать сохранение только правильных значений (в виде строк). У меня есть этот тип в моем Scala:

sealed trait Tribe

object Tribe {
  def fromString(s:String) = s match {
    case "Earth Pony" => EarthPony
    case "Pegasus" => Pegasus
    case "Unicorn" => Unicorn
    case "Alicorn" => Alicorn
    case _ => throw new NoSuchElementException
  }
}

case object EarthPony extends Tribe {
  override def toString = "Earth Pony"
}

case object Pegasus extends Tribe {
  override def toString = "Pegasus"
}

case object Unicorn extends Tribe {
  override def toString = "Unicorn"
}

case object Alicorn extends Tribe {
  override def toString = "Alicorn"
}

Теперь я хочу создать поле TribeField, которое я могу использовать в классе MongoRecord, чтобы убедиться, что это преобразование выполнено, когда я читаю Запись, или сохранить его.

К сожалению, документация по Записи Лифта кажется скудной, и до сих пор я не нашел никакой полезной информации о том, как это сделать. Может быть, кто-то здесь может дать мне несколько советов?

1 Ответ

2 голосов
/ 07 января 2012

Я вполне уверен, что lift-record-mongodb использует возможность экземпляров Field для lift-record для сериализации / десериализации в и из JSON через Field.asJValue и Field.setFromJValue. Чтобы создать полностью безопасное поле Tribe Field, вы должны создать свой собственный TypedField [Tribe] и реализовать эти методы вместе с другими абстрактными методами, которые устанавливают и получают доступ к вашему полю. Я бы посоветовал взглянуть на StringField или один из других конкретных типов полей для указателей на то, как это сделать.

Более простой альтернативой было бы расширение самого StringField и добавление методов setTribe / asTribe.

Если вам нужна дополнительная информация, особенно об интеграции Lift с Mongodb, я бы порекомендовал вам попробовать Lift Google Group. Тим Нельсон, который поддерживает этот код, обычно довольно быстро отвечает на вопросы.

...