কেস ক্লাসে একটি স্ক্যাল অ্যানিমেরেশন থাকে যখন মোঙ্গো কেসক্লাসফিল্ডের সাথে রোগ ব্যবহার করে কোনও মঙ্গো রেকর্ড আপডেট করা যায়


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 [মাইকেসক্লাস] টাইপ এর প্রমাণ পরামিতির জন্য অন্তর্নিহিত মান খুঁজে পাওয়া যায় নি and

আমরা আমাদের MongoCaseClassFieldরোগো ১.১.৮ এ এই কাজটি করতাম, আমাদের নিজস্ব সংস্করণ ব্যবহার করে যা # ফর্ম্যাটগুলি মেথডকে ওভাররিড করে তোলে made তবে সেই বৈশিষ্ট্যটি 2.5-আরসি 6-এ লিফট-মংডোব-রেকর্ডে অন্তর্ভুক্ত করা হয়েছিল, সুতরাং আমরা কী ভেবেছিলাম এটি এখনই কাজ করা উচিত?


9
দেখে মনে হচ্ছে উত্তরটি দুর্বৃত্ত-ব্যবহারকারীদের তালিকায় দেওয়া হয়েছিল: গ্রুকবেস.com
কামস্কি

উত্তর:


7

উত্তর আসছে: http://grokbase.com/t/gg/rogue-users/1367nscf80/how-to-update-a-record-with-mongocaseclassfield-when- کیس-class-contains-a-scala-enumeration# 20130612woc3x7utvaoacu7tv7lzn4sr2q

তবে সরাসরি স্ট্যাকওভারফ্লোতে আরও সুবিধাজনক:


দুঃখিত, আমার এখানে খুব তাড়াতাড়ি imedুকিয়ে দেওয়া উচিত ছিল।

রোগের দীর্ঘস্থায়ী সমস্যাগুলির মধ্যে একটি হ'ল দুর্ঘটনাক্রমে এমন একটি ক্ষেত্র তৈরি করা খুব সহজ ছিল যা BSON হিসাবে ধারাবাহিক না হয়ে যায় এবং রানটাইমের সময় এটি ব্যর্থ হয় (যখন আপনি কোনও মানটি ডিবিওজেক্টে যুক্ত করার চেষ্টা করেন) সংকলনের সময় না করে ।

আমি এটিকে সম্বোধন করার চেষ্টা করার জন্য বিএসএনটি টাইপ শ্রেণি চালু করেছি। উলটোটি হ'ল এটি সংকলন সময়ে 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
   }
 }

আশাকরি এটা সাহায্য করবে,

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.