Scala - 将值传递给模式匹配器(Play Framework 2x)

时间:2013-01-03 01:07:59

标签: scala playframework-2.0 pattern-matching playframework-2.1

我想知道是否有办法将其他值传递给模式匹配器。我正在使用Play Framework 2.1-RC1和mysql。

目前我有一个名为发布的课程,用于在我们的网络应用中表示用户帖子。用户访问该站点,该站点使用以下方法从DB中提取在浏览器中精美呈现的帖子。一切正常。

case class Post(id:Long, message:String)

object Post extends ObjectModel {
  val simple = {
    get[Long]("id") ~
    get[String]("message") map {
      case id~message=>
        Post(
          id,
          message
        )
    }
  }

  def fetch(): List[Post] = {
    DB.withConnection { implicit connection =>
      val ret = SQL( "SELECT id, message FROM post" ).as(Post.simple *)
    }
  }
}

现在,我想要做的是在帖子类中添加另一个字段,表示当前用户(基于会话)是否已已加星标一个帖子与否。这需要额外的DB调用,理想情况下我想做类似以下的事情:

case class Post(id:Long, message:String, starred:Boolean)

object Post extends ObjectModel {
  val simple = {
    get[Long]("id") ~
    get[String]("message") map {
      case id~message=>
        Post(
          id,
          message,
          didStar(id, userId)
        )
    }
  }
...

所以我的问题是如何将 userId 值赋予模式匹配器。我不想通过数据库传递数据。我可以将 userId 传递给fetch()方法,但是如何从模式匹配器中引用它?还是有另一种方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我不知道有关您的架构的详细信息,但您可以设置默认值,并在以后更新它:

case class Post(id:Long, message:String, starred:Boolean)

object Post extends ObjectModel {
  val simple = {
    get[Long]("id") ~
    get[String]("message") map {
      case id~message => Post(
        id, 
        message,
        starred = false // default value
      )
    }
  }
...
val post = // fetch post
val starred = // determine if post was starred
post.copy(starred = starred) // update value

post.copy返回更新字段的新对象。