Я пытаюсь использовать Couchbase в качестве уровня кэша для реляционной базы данных, доступ к которой осуществляется с помощью Slick. Скелет моего кода, что это отношение к вопросу заключается в следующем:Использование Couchbase в качестве кеша поверх Slick
class RdbTable[T <: Table[_]](implicit val bucket: CouchbaseBucket) {
type ElementType = T#TableElementType
private val table = TableQuery[T].baseTableRow
private def cacheAll(implicit session: Session) =
TableQuery[T].list foreach (elem => cache(elem))
private def cache(elem: ElementType) =
table.primaryKeys foreach (pk => bucket.set[ElementType](key(pk, elem), elem))
private def key(pk: PrimaryKey, elem: ElementType) = ???
.......
}
Как вы можете видеть, я хочу, чтобы кэшировать каждый элемент на всех его первичных ключей. Для этого мне нужно получить значение этого ключа для данного элемента. Но я не вижу очевидного способа вычислить значение первичного ключа (значение столбца, если одноколоночный ключ, значение кортежа, если используется несколько столбцов).
Любые предложения о том, что делать? Обратите внимание, что код НЕ ДОЛЖЕН знать, что представляют собой фактические таблицы и их столбцы. Он должен быть полностью общим.
Спасибо, Zim-Zam! Да, я полагаю, что я мог бы смешивать в признаке с объявленным ключом () и определить его в каждом конкретном классе таблицы, а затем перепрыгнуть через некоторые обручи, чтобы вызвать его, поскольку T определяется как расширяющая таблицу [_] , Не лучшее решение, но, безусловно, возможно. Однако моя интуиция подсказывает мне, что это не обязательно. Объект PrimaryKey знает, в каких столбцах он создан, и строка T # TableElementType знает свои значения, поэтому ее можно проецировать только на столбцы первичного ключа. Как странно, что нет простого программного способа сделать это! Или есть? –
silverberry