जब मैंगो कैशेक्लासफिल्ड के साथ दुष्ट का उपयोग करके एक मैंगो रिकॉर्ड को कैसे अपडेट किया जाए, जब केस क्लास में एक स्केलेमेंट एन्यूमरेशन होता है


129

मैं से मौजूदा कोड का उन्नयन कर रहा हूँ Rogue 1.1.8करने के लिए 2.0.0और lift-mongodb-recordसे 2.4-M5 to 2.5

मुझे यह लिखने में कठिनाई हो रही है MongoCaseClassFieldकि इसमें एक स्कैनल एनम है, जो मैं वास्तव में कुछ मदद का उपयोग कर सकता हूं।

उदाहरण के लिए,

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)
  /// ...
}

जब हम इस क्षेत्र में लिखने का प्रयास करते हैं, तो हमें निम्नलिखित त्रुटि मिलती है:

प्रकार com.foursquare.rogue.BSONType [MyCClClass] .and (_। myCaseClass setTo myCaseClass) के साक्ष्य पैरामीटर के लिए अंतर्निहित मान नहीं मिल सका।

हम अपने स्वयं के संस्करण का उपयोग करते हुए, दुष्ट 1.1.8 में यह काम करते थे MongoCaseClassField, जिसने #formats विधि को अधिक महत्वपूर्ण बना दिया था। लेकिन उस सुविधा को 2.5-RC6 में लिफ्ट-मोंगोडब-रिकॉर्ड में शामिल किया गया था, इसलिए हमने सोचा कि यह अभी काम करना चाहिए?


9
ऐसा लगता है कि उत्तर को दुष्ट-उपयोगकर्ता सूची में प्रदान किया गया था: grokbase.com/t/gg/rogue-users/1367nscf80/…
Asya Kamsky

जवाबों:


7

उत्तर से आ रहा है: http://grokbase.com/t/gg/rogue-users/1367nscf80/how-to-update-a-record-with-mongocaseclassfield-when-case-class-contains-a-scala-enumeration# 20130612woc3x7utvaoacu7tv7lzn4sr2q

लेकिन अधिक सीधे यहाँ StackOverFlow पर सुविधाजनक:


क्षमा करें, मुझे यहां जल्द ही पहुंच जाना चाहिए था।

दुष्ट के साथ लंबे समय से चली आ रही समस्याओं में से एक यह था कि गलती से एक क्षेत्र बनाना आसान था जो बीएसओएन के रूप में क्रमिक नहीं था, और क्या यह संकलित समय के बजाय रनटाइम पर विफल रहता है (जब आप उस मूल्य को डीबीओबीजे में जोड़ने का प्रयास करते हैं) ।

मैंने इसे संबोधित करने का प्रयास करने के लिए BSONType प्रकार वर्ग की शुरुआत की। उल्टा यह संकलन के समय BSON त्रुटियों को पकड़ता है। नकारात्मक पक्ष यह है कि जब आप केस कक्षाओं में आते हैं तो आपको एक विकल्प बनाने की आवश्यकता होती है।

यदि आप इसे "सही" तरीके से करना चाहते हैं, तो उस केस क्लास के लिए अपने केस क्लास प्लस को BSONType "गवाह" परिभाषित करें। BSONType गवाह को परिभाषित करने के लिए, आपको उस प्रकार से BSON प्रकार में क्रमांकन प्रदान करना होगा। उदाहरण:

 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
   }
 }

अगर आप प्रत्येक केस क्लास के लिए कर रहे हैं तो यह काफी बोझिल हो सकता है। आपका दूसरा विकल्प एक सामान्य गवाह को परिभाषित करना है जो किसी भी मामले की कक्षा के लिए काम करता है, यदि आपके पास सामान्य क्रमबद्धता योजना है:

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

उम्मीद है की यह मदद करेगा,

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.