Olgu sınıfı bir scala Numaralandırması içerdiğinde MongoCaseClassField ile Rogue kullanarak bir mongo kaydı nasıl güncellenir?


129

Ben mevcut kod yükseltme am Rogue 1.1.8için 2.0.0ve lift-mongodb-recordgelen 2.4-M5 to 2.5.

MongoCaseClassFieldGerçekten biraz yardım alabileceğim bir ölçek listesi içeren yazmakta zorluk çekiyorum .

Örneğin,

object MyEnum extends Enumeration {
  type MyEnum = Value
  val A = Value(0)
  val B = Value(1)
}

case class MyCaseClass(name: String, value: MyEnum.MyEnum)

class MyMongo extends MongoRecord[MyMongo] with StringPk[MyMongo] {
  def meta = MyMongo

  class MongoCaseClassFieldWithMyEnum[OwnerType <: net.liftweb.record.Record[OwnerType], CaseType](rec : OwnerType)(implicit mf : Manifest[CaseType]) extends MongoCaseClassField[OwnerType, CaseType](rec)(mf) {
    override def formats = super.formats + new EnumSerializer(MyEnum)
  }

  object myCaseClass extends MongoCaseClassFieldWithMyEnum[MyMongo, MyCaseClass](this)
  /// ...
}

Bu alana yazmaya çalıştığımızda şu hatayı alıyoruz:

com.foursquare.rogue.BSONType [MyCaseClass] .and (_. myCaseClass setTo myCaseClass) türündeki kanıt parametresi için örtük değer bulunamadı

Bunu Rogue MongoCaseClassField1.1.8'de kendi sürümümüzü kullanarak çalıştırırdık , bu da #formats yöntemini geçersiz kılardı. Ancak bu özellik 2.5-RC6'da lift-mongodb-rekoruna dahil edildi, bu yüzden bunun şimdi çalışması gerektiğini düşündük?


9
Görünüşe göre cevap sahtekar kullanıcılar listesinde sağlanmış
Asya

Yanıtlar:


7

Cevap şu adresten geliyor: http://grokbase.com/t/gg/rogue-users/1367nscf80/how-to-update-a-record-with-mongocaseclassfield-when-case-class-contains-a-scala-enumeration# 20130612woc3x7utvaoacu7tv7lzn4sr2q

Ancak doğrudan StackOverFlow'da daha kullanışlıdır:


Üzgünüm, buraya daha erken uğramalıydım.

Rogue ile uzun süredir devam eden sorunlardan biri, yanlışlıkla BSON olarak serileştirilemeyen bir alan oluşturmanın çok kolay olması ve derleme zamanı yerine çalışma zamanında (bu değeri bir DBObject'e eklemeye çalıştığınızda) başarısız olmasıdır. .

Bunu ele almak için BSONType türü sınıfını tanıttım. Bunun tersi, derleme zamanında BSON hatalarını yakalar. Olumsuz tarafı, konu sınıflara gelince bir seçim yapmanız gerekmesidir.

Bunu "doğru" şekilde yapmak istiyorsanız, vaka sınıfınızı artı bu vaka sınıfı için bir BSONType "tanık" tanımlayın. Bir BSONType tanığı tanımlamak için, bu türden bir BSON türüne serileştirme sağlamanız gerekir. Misal:

 case class TestCC(v: Int)

 implicit object TestCCIsBSONType extends BSONType[TestCC] {
   override def asBSONObject(v: TestCC): AnyRef = {
     // Create a BSON object
     val ret = new BasicBSONObject
     // Serialize all the fields of the case class
     ret.put("v", v.v)
     ret
   }
 }

Bununla birlikte, her vaka sınıfı için yapıyorsanız bu oldukça külfetli olabilir. İkinci seçeneğiniz, genel bir serileştirme şemanız varsa, herhangi bir vaka sınıfı için çalışan genel bir tanık tanımlamaktır:

 implicit def CaseClassesAreBSONTypes[CC <: CaseClass]: BSONType[CC] =
new BSONType[CC] {
   override def asBSONObject(v: CC): AnyRef = {
     // your generic serialization code here, maybe involving formats
   }
 }

Bu yardımcı olur umarım,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.