【问题标题】:How to combine class cases?如何组合类案例?
【发布时间】:2013-07-14 14:52:32
【问题描述】:

我正在使用 play 框架和 slick,play 框架在表单验证中使用案例映射,但有些值我不需要验证,因为它们不是由用户输入的,例如完成的 ID 和日期在后端提供。

到最后我想要一个这样的课堂案例,提供给 Slick 并与我的 Table 一起使用。

case class Order(id: Long, order: String, date: Date)

对于 Play 的表单验证,我将提供一个单独的案例类:

case Class inputableOrder(order: String)

然后我可以创建从 inputableOrder 获取变量并将其添加到 Order 类的 Order 类吗?

case class Order(id: Long, date: Date) // <- some way to add the variable from inputableOrder?

我只是想防止重复,但我仍然需要两个不同的案例类(一个用于表单验证,另一个用于处理数据库)。

有没有办法修改现有案例 Class ,删除变量或修改变量类型?

【问题讨论】:

  • 我认为您使用的“类型”一词是指“变量”、“字段”、“属性”、“参数”或“参数”。在您的第一个示例中,Order、Long、String 和 Date 是类型,而 id、order 和 date 是变量名称。
  • @Tim 大多数情况下我担心参数的类型,因为我无法接收作为列表的复选框帖子(即使我为每个都做了一个并插入 Int),因为案例类变量类型是 Int 并且 Play Form 验证将只接受作为 Int 的帖子,除非我使用与 Slick 使用的类型不同的不同类型的案例类。

标签: scala playframework playframework-2.0 slick


【解决方案1】:

我认为您在这里有几个选择:

  1. 使InputableOrder 成为Order 的一部分:

    case class InputableOrder(order: String) // ...
    case class Order(input: InputableOrder, id: Long, date: Date) // ..
    

    这可能是最惯用的解决方案。但是,如果您后来意识到 InputableOrder 需要一些不应该在 Order 中的东西,这可能是不灵活的。

  2. 使Order 成为InputableOrder 的子类。在这种情况下,在向超类传递参数时会出现一些代码重复,并且超类不能是case 类,因此您必须将其声明为常规类并自己创建提取器:

    class InputableOrder(val order: String) // ...
    object InputableOrder {
      def unapply(o: InputableOrder): Option[String] = Some(o.order);
      // if you have more than one constructor arguments, return
      // a tuple like Option[(String,String)] etc.
    }
    
    case class Order(override val order: String, id: Long, date: Date)
      extends InputableOrder(order) // ...
    

    同样,可能会出现与前一点相同的问题。

  3. 使类不同并创建辅助方法以在它们之间进行转换。选择取决于您的设计,但我发现此解决方案最灵活:

    case class InputableOrder(order: String);
    case class Order(order: String, id: Long, date: java.util.Date) {
      // An additional constructor to use when converting from Inputable:
      def this(other: InputableOrder, id: Long, date: java.util.Date) =
        this(other.order, id, date);
      // Update this instance with `other`:
      def this(that: Order, other: InputableOrder) =
        this(other, that.id, that.date);
    
      def toInput = InputableOrder(order);
    }
    

    这样,您只需提供缺少的字段,就可以从InputableOrder 创建Order,反之亦然。您需要编写一次这些辅助方法/构造函数,但是使用它们很容易。

    你也可以使用隐式方法,例如

    implicit def toInput(other: InputableOrder): Order = other.toInput;
    

    让事情变得更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多