Наследование карт в слик 2.0
Я знаю, что есть другие вопросы по переполнению стека, но ни один из них не работает для меня.
Я пытаюсь отобразить простое наследование в скользкой проекции
Я пробую сотни комбинаций, я не могу сделать эту компиляцию. Я заканчиваю следующим кодом и ошибкой ниже.
Я упрощаю тематические классы, потому что у них гораздо больше данных. Без наследования мои другие уровни (контроллеры, сервисы и интерфейс) будут иметь дело со сложностью, потому что в этом случае модель представляет реальные объекты, которые наследуются в виде триста, нет лучшего представления, чем наследование для этих классов. На уровне сервисов и контроллеров я заставляю Json-представление классов получать именно то, что мне нужно, я могу отправлять и использовать Json API, представляющий мою модель, единственное, что остается на пути - сохранить это представление в реляционной базе данных, моей реляционной модели. способен сохранять эти объекты в одной таблице наследования, но переводить строки в реляционные - это очень сложно.
Я использую scala 2.10.3 + sbt 0.13.1
abstract class Pessoa2(val nome:String, val tipo:String)
case class PessoaFisica2(override val nome:String, val cpf:String) extends Pessoa2(nome,"F")
case class PessoaJuridica2(override val nome:String, val cnpj:String) extends Pessoa2(nome, "J")
class PessoaTable(tag: Tag) extends Table[Pessoa2](tag, "PESSOAS"){
// def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
def nome = column[String]("nome")
def tipo = column[String]("tipo")
def cpf = column[String]("CPF", O.Nullable)
def cnpj = column[String]("CNPJ", O.Nullable)
def * = (nome, tipo, cpf.?, cnpj.?) <> ({
case (nome:String,"F",cpf:Option[String],_) => new PessoaFisica2(nome, cpf.get):Pessoa2
case (nome:String,"J",_,cnpj:Option[String]) => new PessoaJuridica2(nome, cnpj.get):Pessoa2
},{
case PessoaFisica2(nome, Some(cpf)) => Some((nome, "F", cpf, ""))
case PessoaJuridica2(nome, Some(cnpj)) => Some((nome, "J", "", cnpj))
})
}
Это заканчивается ошибкой:
Типы аргументов анонимной функции должны быть полностью известны. (SLS 8.5) [ошибка] Ожидаемый тип:? =>?
[ошибка] def * = (nome, tipo, cpf.?, cnpj.?) <> ({
[ошибка] ^
[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:158: несоответствие типов;
[ошибка] найдена: любая
[ошибка] требуется: строка
[error] case (nome, "F", cpf, _) => new PessoaFisica2 (nome, cpf): Pessoa2
[ошибка] ^
[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:158: несоответствие типов;
[ошибка] найдена: любая
[ошибка] требуется: строка
[error] case (nome, "F", cpf, _) => new PessoaFisica2 (nome, cpf): Pessoa2
[ошибка] ^
[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:159: несоответствие типов;
[ошибка] найдена: любая
[ошибка] требуется: строка
[error] case (nome, "J", _, cnpj) => new PessoaJuridica2 (nome, cnpj): Pessoa2
[ошибка] ^
[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:159: несоответствие типов;
[ошибка] найдена: любая
[ошибка] требуется: строка
[error] case (nome, "J", _, cnpj) => new PessoaJuridica2 (nome, cnpj): Pessoa2
[ошибка] ^
[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:160: отсутствует тип параметра для расширенной функции
[ошибка] Типы аргументов анонимной функции должны быть полностью известны. (SLS 8.5)
[ошибка] Ожидаемый тип был:? => Опция [?]
[ошибка] },{
[ошибка] ^
[ошибка] /Users/giovanni/Projetos/atende/clientes/app/model/Pessoas.scala:157: не найдено подходящей фигуры.
[ошибка] Слик не знает, как сопоставить данные типы.
[ошибка] Возможные причины: T в таблице [T] не соответствует вашей * проекции. Или вы используете неподдерживаемый тип в Query (например, Scala List).
[ошибка] Требуемый уровень: scala.slick.lifted.ShapeLevel.Flat
[ошибка] Тип источника: (scala.slick.lifted.Column [String], scala.slick.lifted.Column [String], scala.slick.lifted.Column [Option [String]], scala.slick.lifted.Column. [Вариант [String]])
[ошибка] Распакованный тип: (строка, строка, строка, строка)
[ошибка] Тип упаковки: Любой
[ошибка] def * = (nome, tipo, cpf.?, cnpj.?) <> ({
[ошибка] ^
[ошибка] 7 найденных ошибок
1 ответ
Попробуй это:
abstract class Pessoa2(val nome:String, val tipo:String)
case class PessoaFisica2(override val nome:String, val cpf:String) extends Pessoa2(nome,"F")
case class PessoaJuridica2(override val nome:String, val cnpj:String) extends Pessoa2(nome, "J")
class PessoaTable(tag: Tag) extends Table[Pessoa2](tag, "PESSOAS"){
// def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
def nome = column[String]("nome")
def tipo = column[String]("tipo")
def cpf = column[String]("CPF", O.Nullable)
def cnpj = column[String]("CNPJ", O.Nullable)
def * = (nome, tipo, cpf.?, cnpj.?) <> ({ t : (String, String, Option[String], Option[String])=> t match{
case (nome:String,"F",cpf:Option[String],_) => new PessoaFisica2(nome, cpf.get):Pessoa2
case (nome:String,"J",_,cnpj:Option[String]) => new PessoaJuridica2(nome, cnpj.get):Pessoa2
}},{ k: Pessoa2 => k match{
case PessoaFisica2(nome, cpf) => Some((nome, "F", Some(cpf), Some(""))): Option[(String, String, Option[String], Option[String])]
case PessoaJuridica2(nome, cnpj) => Some((nome, "J", Some(""), Some(cnpj))): Option[(String, String, Option[String], Option[String])]
}})
}
Это должно скомпилировать таким образом