1

オブジェクトのリストを含む Web サービスを作成する必要があります。1 つのリストには、多くのタイプのオブジェクトを含めることができます。たとえば、ここにメディア アイテムのライブラリがあります。各アイテムは、リンクまたはビデオのいずれかであり、それぞれに独自のメタデータがあります。

WAR にコンパイルするものが必要で、以前に Lift を使用したことがあるからです。

この種のストレージに MongoDB を使用すると、定義上、異種アイテムのコレクションを処理できるはずなので、うまくいくと思いました。

Lift レコードに格納する BSON オブジェクトのタイプを定義することはできますが、1 つのレコード/コレクションに 1 つのタイプのオブジェクトのみを作成することに固執することはできないようです。理想的には、ライブラリ内の各「もの」(適切な言葉がないため) をビデオまたはリンクにしたいと考えています。例えば:

[
  {
    "type"       : "Video",
    "title"      : "Story",
    "videoID"    : "123ab4",
    "description": "Feature-length epic",
    "time"       : 12.6
  },
  {
    "type" : "link",
    "url"  : "http://www.google.com",
    "title": "Search for stuff"
  }
]

適切なタイプの継承でそれを実行できるはずですが、すべてのレコード オブジェクトの親がオブジェクトから継承する方法に戸惑います。これを機能させることはできますか?Lift がそのように使用できるさまざまなもののコレクションをお持ちですか?

これが私がこれまでに持っているものです。私はそれをテストしていませんが、それが機能したとしても、私が望むものではありません

import net.liftweb.record._
import net.liftweb.record.field._

import net.liftweb.mongodb._
import net.liftweb.mongodb.record._
import net.liftweb.mongodb.record.field._


class VideoShelf private () extends BsonRecord[VideoShelf] {
  def meta = VideoShelf

  object title       extends StringField (this, 256)
  object videoID     extends StringField (this, 32 )
  object description extends StringField (this, 256)
  object time        extends DecimalField(this, 0  )
}

object VideoShelf extends VideoShelf with BsonMetaRecord[VideoShelf]


class LinkShelf private () extends BsonRecord[LinkShelf] {
  def meta = LinkShelf

  object url   extends StringField(this, 128)
  object title extends StringField(this, 256)
}

object LinkShelf extends LinkShelf with BsonMetaRecord[LinkShelf]


class MediaLibrary private () extends MongoRecord[MediaLibrary] with ObjectIdPk[MediaLibrary] {
  def meta = MediaLibrary

  ///////////////////////////////////////
  ///////////////////////////////////////
  // What I want is this record type to
  // contain either of these:
  ///////////////////////////////////////      
  object videoshelf extends BsonRecordField(this, VideoShelf)
  object linkshelf  extends BsonRecordField(this, LinkShelf )
}

object MediaLibrary extends MediaLibrary with MongoMetaRecord[MediaLibrary]

どうすればこれを入手できますか?

4

1 に答える 1

1

さらに検索した結果、次の投稿を見つけました: https://groups.google.com/forum/#!topic/liftweb/LmkhvDgrgrI

まだテストされていませんが、これは正しいと思います。それが完全に機能するために、いくつかのピースが欠けている可能性があります。

import net.liftweb.record._
import net.liftweb.record.field._

import net.liftweb.mongodb._
import net.liftweb.mongodb.record._
import net.liftweb.mongodb.record.field._


/**
 * The base record type for library objects.
 */
trait MediaLibrary[T <: MediaLibrary[T]] extends MongoRecord[T] with ObjectIdPk[T] {
  self: T =>
}

/**
 * Items in the library that are videos.
 */
class VideoItem extends MediaLibrary[VideoItem] {

  def meta = VideoItem

  object title       extends StringField (this, 256)
  object videoID     extends StringField (this, 32 )
  object description extends StringField (this, 256)
  object time        extends DecimalField(this, 0  )
}

object VideoItem extends VideoItem with MongoMetaRecord[VideoItem]

/**
 * Items in the library that are links.
 */
class LinkItem extends MediaLibrary[LinkItem] {

  def meta = LinkItem

  object url         extends StringField (this, 256)
  object title       extends StringField (this, 256)    
}

object LinkItem extends LinkItem with MongoMetaRecord[LinkItem]


アップデート

また、ケース クラスのリストである MongoDB 固有のレコードがあることも知りました。それはまさに私が必要としているもののようです!それは、Scala と Mongo を連携して使用することの威力です! それが私が最初から望んでいたことです。明日それを試してみる必要があります。

于 2014-02-10T21:52:32.780 に答える