извлечение поля по имени из любого Mapper в лифте - PullRequest
3 голосов
/ 25 ноября 2011

Как мы получаем желаемое поле из любого преобразователя, чтобы использовать его в параметре Query.

В моем случае я хочу найти записи, в которых мое «поле желаемого» имеет значение = somevalue.

пробовал следующим образом

foo(Users)

// foo defined here...

def foo ( modelObject:Mapper[_])={

    var field =modelObject.fieldByName("UserName").openTheBox.asInstanceOf[MappedField[_,Users]]
    var requiredUser = modelObject.find(By(field, "dummyUser")

}

, но затем вынуждает меня указать фактический Mapper в asInstanceOf[MappedField[_,Users]] (здесь передается экземпляр Users). Я хочу, чтобы он работал для любого Mapper, а не только для пользователей.

Не работает с asInstanceOf[MappedField[_,_]]

Я понимаю, что каждый Mapper может не иметь нужного мне поля, и в этом случае, если функция .fieldByName() должна выдать какое-то исключение, это приемлемо. Но, по крайней мере, для тех, кто подал, это должно работать.

Может ли кто-нибудь помочь мне в этом ...

Ответы [ 2 ]

1 голос
/ 02 декабря 2011
def foo[A<: Mapper[A],T](modelObject: A) = {
  val field = modelObject.asInstanceOf[Mapper[A]].fieldByName("userName").openTheBox.asInstanceOf[MappedField[T, A]]
  modelObject.asInstanceOf[MetaMapper[A]].find(By(field, "dummyUser".asInstanceOf[T])
}

Можете ли вы сделать что-то подобное, когда звоните:

foo[Users,String](Users)
0 голосов
/ 22 декабря 2011

Вместо супер-метода, который делает все это, почему бы вам не передать функцию поиска в качестве параметра.

def foo[T](find: () => Option[T]) : Option[T] =  find()

и вызвать это:

foo[User](() => User.find(By(User.userName, "dummy"))
...