나는 학교 개체의 스칼라 슬릭 테이블을하고 난 0-5 매개 변수는 필터 객체 SchoolFilter
포함에 따라 필터링 할 :Scala SQL (Slick 1.0.1) 쿼리를 변경 가능하지 않은 방식으로 수행하려면 어떻게해야합니까?
case class SchoolFilter(name: Option[String],
city: Option[String],
state: Option[String],
zip: Option[String],
district: Option[String])
None
값에서 모든 키를 필터링하지 않음 "을 의미합니다 "나는 School 객체 테이블과 사용자 입력을 기반으로하는 필터를 수행하는 AJAX 호출이있는 html 페이지가 있기 때문입니다. 모든 학교의 변경 가능한 목록을 만든 다음 정의 된 각 구성원 인 SchoolFilter
에서 필터를 실행하여이 동작을 구현했습니다. 그러나이 방법은 데이터베이스에서 모든 레코드를 빨아 들이고 그 결과를 반환하기 전에 목록을 5 번 통과하는 것이 매우 효율적으로 보이지 않습니다.
이 목표를 달성하는 데 더 기능적 (또는 더 효율적인) 방법이 있습니까?
def findSchoolsByFilter(f: SchoolFilter = SchoolFilter(None, None, None, None, None),
n: Int = 5)
(implicit session: Session) = Try {
var s = collection.mutable.LinkedList(Query(Schools).list().toSeq: _*)
if (f.name.isDefined)
s = s.filter(_.name.toLowerCase.startsWith(f.name.get.toLowerCase))
if (f.city.isDefined)
s = s.filter(_.city.toLowerCase.startsWith(f.city.get.toLowerCase))
if (f.state.isDefined)
s = s.filter(_.state.toLowerCase.startsWith(f.state.get.toLowerCase))
if (f.zip.isDefined)
s = s.filter(_.zip.toLowerCase.startsWith(f.zip.get.toLowerCase))
if (f.district.isDefined)
s = s.filter(_.district.toLowerCase.startsWith(f.district.get.toLowerCase))
List(s.toSeq: _*).take(n).sorted
}
제 생각에'Seq [SchoolFilter => Option [String]]'이 줄었습니다. – rightfold
중복 코드에 관해서는 변경 가능한 목록에 대해서는별로 신경 쓰지 않겠지 만. 고차 함수를 사용하십시오. – rightfold