2014-09-14 3 views
0

Еще одна черты вопроса :-(Как заменить признак IdPK на пользовательский признак, который использует основной ключ String вместо Long Primary Key?

Я смешение в черте IdPK в мою модель Lift Mapper следующим образом:

class Test1 extends LongKeyedMapper[Test1] with IdPK { 

Я хотел бы перейти на использование строковых индексов вместо длинных индексов (I не хочу, но я должен, сейчас) Я пытаюсь написать черту StringIdPK заменить IdPK черту Вот моя попытка:..

trait StringIdPK /* extends BaseLongKeyedMapper */ { 
    self: KeyedMapper[String] => 
    def primaryKeyField = id 
    object id extends MappedStringIndex(this, 50) 
} 

(я на основе этого на IdPK черта, которая заключается в следующем:

trait IdPK /* extends BaseLongKeyedMapper */ { 
    self: BaseLongKeyedMapper => 
    def primaryKeyField = id 
    object id extends MappedLongIndex[MapperType](this.asInstanceOf[MapperType]) 
} 

код этого признака можно найти here)

Когда я пытаюсь скомпилировать, я получаю следующее сообщение об ошибке:

wrong number of type arguments for net.liftweb.mapper.KeyedMapper, should be 2 

Спецификация KeyedMapper (который может быть найден here) является:

trait KeyedMapper[KeyType, OwnerType <: KeyedMapper[KeyType, OwnerType]] extends Mapper[OwnerType] with BaseKeyedMapper 

Мне нужно лучше понять, что означает OwnerType <: KeyedMapper[KeyType, OwnerType] и как разместить его в моем обычном черте выше. Поэтому мой вопрос: что я делаю неправильно в моем определении признака StringIdPK выше? (Это поможет мне понять, как бороться с OwnerType <: KeyedMapper[KeyType, OwnerType]).

Спасибо!

ОБНОВЛЕНИЕ: Я думаю, что следующее решение близко к нему (см. Ниже - я взял код из here). Это все еще не совсем верно, поскольку компилятор все еще жалуется на объекты FK, которые я расширил, не имея чужой мета-определенной.

trait BaseStringKeyedMapper extends BaseKeyedMapper{ 
    override type TheKeyType = String 
} 

trait StringKeyedMapper[OwnerType <: StringKeyedMapper[OwnerType]] extends KeyedMapper[String, OwnerType] with BaseStringKeyedMapper { 
    self: OwnerType => 
} 


trait StringKeyedMetaMapper[A <: StringKeyedMapper[A]] extends KeyedMetaMapper[String, A] { 
    self: A => 
} 

trait StringIdPK { 
    self: BaseStringKeyedMapper => 
    def primaryKeyField = id 
    object id extends MappedStringIndex[MapperType](this.asInstanceOf[MapperType], 50) 
} 

Кроме того, была проводка по этому вопросу on the lift google group here, но это, кажется, не решен.

+1

В чем проблема? Я только что скомпилировал и использовал этот код для создания модели Mapper с помощью StringKeyedMapper. – alcarv

+0

@ Андре Луис, спасибо за ваш комментарий. Я снова проверил, и теперь он работает. Я думаю, что проблема, с которой я раньше сталкивалась, заключалась в добавлении поля владельца и сопоставлении этого как внешнего ключа пользователя, и я все еще не могу получить строку PK. Благодарю. –

ответ

0

Я думаю, что следующее это решает (я не могу подтвердить это сейчас, потому что я работаю над другим вопросом, прежде чем я смогу его протестировать, но, похоже, это работает до сих пор. Я взял код из here и . here Я буду обновлять это, как я могу узнать больше об этой реализации):

trait BaseStringKeyedMapper extends BaseKeyedMapper{ 
    override type TheKeyType = String 
} 

trait StringKeyedMapper[OwnerType <: StringKeyedMapper[OwnerType]] extends KeyedMapper[String, OwnerType] with BaseStringKeyedMapper { 
    self: OwnerType => 
} 

trait StringKeyedMetaMapper[A <: StringKeyedMapper[A]] extends KeyedMetaMapper[String, A] { 
    self: A => 
} 

trait StringIdPK { 
    self: BaseStringKeyedMapper => 
    def primaryKeyField = id 
    object id extends MappedStringIndex[MapperType](this.asInstanceOf[MapperType], 50) { 
     override def writePermission_? = true // if u want to set it via your code, keep this true 
     override def dbAutogenerated_? = false 
     override def dbNotNull_? = true 

     // override def writePermission_? = false 
     override def readPermission_? = true 
     override def shouldDisplay_? = true 
     override def show_? = true 
     override def dbDisplay_? = true 
     override def validations = valUnique(S.?("Must be unique")) _ :: super.validations 
    } 
} 

Я добавил некоторое переопределение к id полю для смешивания это вместе с CRUDify. По какой-то причине я не могу понять, valUnique не работает (другие проверки, такие как valMinLen, действительно работают. Я отправлю новый вопрос об этом.