У меня есть класс Song
и класс Album
. Моя цель состоит в том, чтобы иметь две отдельные коллекции и хранить ссылку через BSONObjectID
в базе данных, но в моем коде я хочу сопоставить эти идентификаторы с их соответствующими объектами.Как создать пользовательский сценарий/считыватель, который запрашивает БД?
Вот моя текущая модель:
case class Song(var _id: Option[BSONObjectID] = None,
name: String,
albumId: BSONObjectID,
var created: Option[DateTime] = None,
var updated: Option[DateTime] = None
)
И я хочу, чтобы заменить albumId
с album
:
Вот моя текущая модель:
case class Song(var _id: Option[BSONObjectID] = None,
name: String,
album: Album,
var created: Option[DateTime] = None,
var updated: Option[DateTime] = None
)
Как documentation состояний, я должен создать для этого пользовательский писатель/читатель. Тем не менее, моя проблема заключается в том, что я не знаю, как я могу запросить внутри моей пользовательской программы чтения/записи базы данных, чтобы получить все необходимые поля для создания экземпляра моего Album
. Так ли это должно работать? Запрос базы данных в модели?
object Song {
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
import reactivemongo.play.json.BSONFormats.BSONObjectIDFormat
implicit val songReads: Reads[Song] = (
(__ \ "_id").readNullable[BSONObjectID].map(_.getOrElse(BSONObjectID.generate)).map(Some(_)) and
(__ \ "album").read[BSONObjectID].map(x => Album(_id = Option(_), ...)) and // ???
(__ \ "created").readNullable[DateTime].map(_.getOrElse(new DateTime())).map(Some(_)) and
(__ \ "updated").readNullable[DateTime].map(_.getOrElse(new DateTime())).map(Some(_))
) (Song.apply _)
implicit val songWrites: OWrites[Song] = (
(__ \ "_id").writeNullable[BSONObjectID] and
(__ \ "album").write[BSONObjectID] and // ???
(__ \ "created").writeNullable[DateTime] and
(__ \ "updated").writeNullable[DateTime]
) (unlift(Song.unapply))
}
«Читает» не должно выполнять никаких действий, кроме чтения. Я бы сказал, что это намек на недостаток дизайна. – cchantep