2016-04-11 1 views
2

Я пытаюсь добиться чего-то вроде журнальных столов.scala slick обработка более двух одинаковых таблиц структуры одной моделью

Скажем, у меня есть ...

final class LogTable(tag: Tag) extends Table[LogModel](tag,"log"){ 
    def createdAt = column[Timestamp]("created_at") 
    //... 
} 

Поскольку журнал становится слишком много записей для одной таблицы, я хочу использовать несколько таблиц, которые имеет точно такую ​​же структуру, но разные имена. по-другому, я хочу изменить только Table[](tag,"this name"), и если это возможно, я хочу, чтобы он действовал как одна таблица, когда ее вызывали извне.

ток моей реализации

class LogBase(tag: Tag) extends Table[LogModel](tag,"log"){ 
    def createdAt = column[Timestamp]("created_at") 
    //... 
} 

final class LogTable1(tag:Tag) extends LogBase(tag){ 
    override val tableName = "log1" 
} 

final class LogTable2(tag:Tag) extends LogBase(tag){ 
    override val tableName = "log2" 
} 

//... 

запись таблица, как многие, как мне нужно, это последний вариант, хотя, есть ли способ для достижения этой цели в умном способе?

приветствуется любое предложение.

+0

ли эти таблицы разделены по дате или какой-либо другой логики? – nmat

+0

Да, он будет разделен идентификаторами. что-то вроде этого 'idNum% 100' == targetTableNumber – suish

ответ

3

как путь NMAT упоминалось, делает класс генератора класса таблицы решить эту проблему.

class LogBase(tableNum: Int){ 
    class LogTable(tag: Tag) extends Table[LogModel](tag,s"log$tableNum"){ 
    def createdAt = column[Timestamp]("created_at") 
    //... 
    } 
} 

и как использовать его

val tables = (1 to 10).toList.map { num => 
    val clazz = new LogBase(num) 
    TableQuery[clazz.LogBase.LogTable] 
} 
+0

Интересно, как бы вы сделали foreignKey def на LogTable, если имя таблицы в foreignKey def также нужно было бы передать как аргумент конструктора? – ChoppyTheLumberjack

1

Почему бы вам просто не передать имя таблицы в качестве аргумента?

class LogBase(tag: Tag, id: Int) extends Table[LogModel](tag, s"log${id % 100}") 

Вы можете создать фабрику абстрагировать эту логику

+0

то, как вы написали, все равно нужно что-то сделать для имени класса. Класс также должен быть другим. Я пробовал, как вы публикуете, прежде чем спрашивать здесь, но в конечном итоге стал требовать 'eval'. или У вас есть другое решение? – suish