gpt4 book ai didi

design-patterns - 创建两种不同类型的用户(Scala、Lift)

转载 作者:行者123 更新时间:2023-12-03 23:36:04 25 4
gpt4 key购买 nike

我正在创建一个需要两类用户的网站:学生和提供者。在传统的 java 设置中,我会创建一个用户类(或接口(interface)),然后创建两个从用户继承的类。这也是scala中最好的类(class)吗,使用“extends”和“with”修饰符?如果这确实是最好的方法(我怀疑它是),那么在数据库中映射它的最佳方法是什么?最好保留一个“类型”列,然后将其设置为一个或另一个?

第二个问题是如何使用 View 。根据用户类型的不同,显示会非常不同,因此我认为将涉及一些严重的路由逻辑,或者至少是 View 中的片段中内置的逻辑。

我想最重要的问题是:是否有一种“首选”的方式来做这件事(比如 Rails 中的食谱等),还是我自己一个人出去?

谢谢

最佳答案

If that is indeed the best way (which I suspect it is), what the best way to map this in the DB? Would it be best to keep a "type" column and then have it set to one or the other?



我认为在给定场景的情况下设计数据库结构没有明确的“最佳方法”。教科书答案是 database normalizationDRY .

三表法

例如,一种方法可以是创建包含两种用户类型的 User 表,仅存储公共(public)属性,并使用 User 表的外键和专用属性(如果有)创建 Student 表和 Provider 表。这可能不是传统的关系数据库人员会推荐的,但它更接近于 OO 继承模型。

一张 table 的方法

像您所说的另一种方法是只创建一个“UserType”字段并将两种类型的用户存储到用户表中。这很简单,但是您会错过利用关系数据库的引用完整性的机会。例如,如果您要创建仅针对 Student 的子表(例如 Homework),如果学生和提供者都住在 User 表中,则不能简单地为 StudentID 创建外键。

两张表接近

如果您使用的是对象关系映射框架,最简单的方法可能是将对象世界海峡中您想要的内容准确映射到数据库中,这将具有 Student 表和 Provider 表,并将两者的共性表示为 trait在斯卡拉方面。

我找到了电梯 cheat sheet :

Defining Models

lift O-R mapped models are defined based on a class with fields.


class WikiEntry extends KeyedMapper[Long, WikiEntry] {
def getSingleton = WikiEntry // what's the "meta" object
def primaryKeyField = id

// the primary key
object id extends MappedLongIndex(this)

// the name of the entry
object name extends MappedString(this, 32) {
override def dbIndexed_? = true // indexed in the DB
}

object owner extends MappedLongForeignKey(this, User)

// the text of the entry
object entry extends MappedTextarea(this, 8192) {
override def textareaRows = 10
override def textareaCols = 50
}
}

Discussion on having shared base traits for Models.



在线程中大卫波拉克写道:

You're looking for some Scala magic:


trait Posting[MyType <: Mapper[MyType]] { // Defines some common fields for posted user content 
self: MyType =>
def primaryKeyField = id
object id extends MappedLongIndex(this)
object creator extends MappedLongForeignKey(this, User)
object createdAt extends MappedLong(this) {
override def defaultValue = System.currentTimeMillis
}
}

class FooPosting extends KeyedMapper[FooPosting] with Posting[MyType]

关于design-patterns - 创建两种不同类型的用户(Scala、Lift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1511399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com