光滑过滤器的正确使用

right usage of slick filter

我正在使用 slick 访问数据库。我想这样查询:

case class Coupon(couponId: Long, shopId: String)

class Coupons(tag: Tag) extends Table[Coupon](tag, "coupons"){

  def couponId = column[Long]("coupon_id")

  def shopId = column[String]("shop_id")

  override def * = (couponId, shopId) <> (Coupon.tupled, Coupon.unapply)
}

object Coupons extends TableQuery(new Coupons(_)){

  def findCouponBy(couponId: Long, shopId: Option[String]) = {

    val s = DB.createSession()
    try {
       val q = for {
           coupon <- this.filter(c => c.couponId === couponId && 
                shopId.map(s => c.shopId === s).getOrElse(true)
        } yield coupon
      s.database.run(q.result)
    } finally s.close
  }
}

我认为这可能有效。但是,编译器告诉我 错误:(126,-1)播放 2 编译器: 类型不匹配; 发现:任何 要求:slick.lifted.Rep[?]

问题出在这里: shopId.map(s => c.shopId === s).getOrElse(真)

我想知道如何才能完成这项工作。

我正在使用 slick 3.0.0-RC

使用slick.lifted.LiteralColumn(true)

Scala 的类型推断限制

answer, you can use the following API since Slick 3.3.0中所述:

def findCouponBy(couponId: Long, shopId: Option[String]) = {
  val query = 
    this
      .filter(_.couponId === couponId)
      .filterOpt(shopId){ case (table, sid) =>
        table.filter(_.shopId === sid)
      }

  db run query.result
}