0

如何在grails中保存类扩展?例如我有班级用户和管理员

class User {
    String name
    String password
}

class Administrator extends User {
    String authoritySelected
}

在用户类中的示例我保存了“user1”,然后我想将 user1 从类用户更改为类管理员并更新 authoritySelected

def update(){
    def user1 = User.get("user1")
    user1.authoritySelected
    user1.save(flush:true)
}

并得到错误:

没有这样的属性:authoritySelected for class:User

那么,如何在 User 类中保存 authoritySelected 并将其更改为 Administrator 类?谢谢。

4

3 回答 3

1

说到语法,你写的代码没有意义。说到设计,也不是。

我可以建议你在尝试做这种事情之前学习一点 OOP 吗?:)

但是让我们面对您提交的问题。

第一个建议:不要为你的应用程序实现安全系统,有很多东西可以为你做。最重要的一个:Spring Security 插件

第二:您编写的代码不起作用,因为扩展一个类是使另一个类成为父类的“儿子”的一种方式。在您的示例中,管理员是用户的儿子。

def update(){
    def user1 = User.get("user1") // I don't get how this should work, but I'll leave it like this in this example
    user1.authoritySelected // you're trying to GET the value a property that doesn't exist in the User class, you should SET something here
    user1.save(flush:true)
}

如果你想让你的用户改变角色,最简单的想法是认为角色不是另一个类,而是它应该是用户的一个属性,所以你可以改变它。一旦创建了类的实例,就无法更改它(可能这并不完全正确,但您不应该这样做)。

好的,一些代码:

class User {
    String name
    String password
    String authority // a property of the class you can change
}

def update(){
   def user1 = User.get("user1") 
   user1.authority = 'Administrator' // change the property on the instance you retrieved
   user1.save() // save the instance itself
}

这对我来说仍然不是一个好的设计解决方案,我只是想让你能够看到你做错了什么。

于 2013-02-11T12:57:35.843 回答
0

当您说“然后我想将 user1 从班级用户更改为班级管理员”时,您到底想做什么?

您正在尝试访问该对象中不存在的对象的属性。向下转换根本不是那样工作的。您应该实例化一个类型为 Administrator 的对象,以便在之后保存其属性之一。

于 2013-02-11T09:20:17.863 回答
0

如果要创建 USER,则必须创建 USER 的实例,例如:

User u = new User(name: "xpto", password: "xptopass").save(flush:true)

管理员也是一个用户,但还有一个数据,即权限选择,因此如果管理员扩展用户,他也拥有与用户相同的数据。

Administrator a = new Administrator(name: "xpto", password: "xptopPass", authoritySelected: "ADMIN").save(flush:true)

注意,Object.get(X) 方法需要一个 ID (Long),“X”将是一个 Long 值,而不是一个字符串。 http://grails.org/doc/2.3.x/ref/Domain%20Classes/get.html

于 2014-04-09T11:19:11.587 回答