【问题标题】:Making it easier to create a Form object in Play Framework with ReactiveMongo使用 ReactiveMongo 在 Play Framework 中更轻松地创建 Form 对象
【发布时间】:2015-05-02 08:01:25
【问题描述】:

编辑:对于那些想知道我打算如何根据接受的答案解决它的人,请参阅嵌套值here

我正在使用带有 Scala 和 Reactive Mongo 的 Play Framework。

目前我正在创建这样的案例类和表单:

case class Person(
  _id : Option[BSONObjectID],
  name: string,
  city: string)

object Person {
  val form: Form[Person] = Form {
    mapping(
      "_id" -> optional(of[String] verifying pattern(
      """[a-fA-F0-9]{24}""".r,
      "constraint.objectId",
      "error.objectId")),
      "name"-> text,
      "city"-> text)
    { (id,name, city) => Person(id.map(new BSONObjectID(_)), name, city) }
    { person =>Some(person._id.map(_.stringify), person.name, person.city)  }
  }
}

如果我在 _id 属性中使用简单类型,例如 String,我可以做一些更简单的事情,例如:

object Person {
  val form: Form[Person] = Form {
    mapping(
      "_id" -> text,
      "name"-> text,
      "city"-> text
      )(Person.apply)(Person.unapply)
  }
}

所以我想我可以创建自己的应用方法来更改第一个参数,使用柯里化。我会这样定义:

def apply2(id: Option[String]) = {
  val bsonid = id.map(new BSONObjectID(_))
  (Person.apply _).curried(bsonid)
}

我的理论是,哪个实现不起作用,我将部分应用 BSONObjectID 参数到 Person.apply 函数,该值将来自名为 idapply2 参数。它不起作用。

我是一个懒惰的人,不想仅仅因为现在我有一个默认情况下不支持的新情况而输入一堆东西...... currying 是我的赌注之一,但任何解决方案可以更容易地创建表单是可以接受的。

我只需要一种方法来识别对象,这样我就可以在之后删除或更新它,但是目前的方法输入起来有点无聊,我认为 MongoDB 创建的 _id 字段是完美的。

有什么方法可以让事情变得更简单,或者我只需要停止懒惰吗?

【问题讨论】:

    标签: mongodb scala playframework playframework-2.0 reactivemongo


    【解决方案1】:

    您可以通过创建 2 个案例类来简化事情。 数据输入到位时使用的一种

    case class PersonData(name: String, city: String)
    

    另一个代表模型中的真实人物

    case class Person(_id: BSONObjectID, name: String, city: String)
    

    在 Person 对象的创建方法中:

    def fromData(data: PersonData) = Person(
      id = new BSONObjectID(),
      name = data.name,
      city = data.city)
    

    然后您的映射 From[PersonData] 可以更简单,并且您避免 Option[BSONObjectID] 在您的模型周围飞来飞去。

    【讨论】:

    • 不错!这也解决了我的类与 MongoDB 过于耦合的问题。我回家后测试一下。你觉得 case class Person(_id: BSONObjectID, data: PersonData) 这样的东西怎么样?
    • 那也不错。根据我的经验,当您的模型增长时,我认为将可编辑数据保留在 data 字段中会很好,例如。 Person(_id, data, events, connections, etc.)。同样好的模式是为 id 设置特殊情况类,例如。 PersonId(value: BSONObjectID).
    • 酷。这样,我可以通过使用嵌套值使其变得更加容易。我编辑了我的答案。这样我只需要声明从表单中获取 Id 的部分。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2013-08-21
    相关资源
    最近更新 更多