0

クラス拡張をgrailsに保存する方法は?例私はクラスのユーザーと管理者を持っています

class User {
    String name
    String password
}

class Administrator extends User {
    String authoritySelected
}

クラスUserの例「user1」を保存してから、user1をクラスuserからクラスadministratorに変更し、authoritySelectedを更新したい

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

エラーが発生します:

そのようなプロパティはありません:authoritySelected for class:User

では、authoritySelectedをクラスUserに保存し、それをクラスAdministratorに変更するにはどうすればよいですか?ありがとう。

4

3 に答える 3

1

構文について言えば、あなたが書いたコードには意味がありません。デザインについて言えば、どちらでもありません。

この種のことを試みる前に、少しOOPを勉強することをお勧めしますか?:)

しかし、あなたが提出した問題に直面しましょう。

最初の提案:アプリケーションにセキュリティシステムを実装しないでください。それを実行できるものはたくさんあります。とりわけ、SpringSecurityプラグイン

2番目:クラスを拡張することは、親の別のクラスを「息子」にする方法であるため、作成したコードは機能しません。あなたの例では、管理者はユーザーの息子です。

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)
}

ユーザーに役割を変更させたい場合、最も簡単な考えは、別のクラスとしてではなく役割を考えることです。代わりに、ユーザーの属性である必要があるため、変更できます。クラスのインスタンスが作成されると、それを変更することはできません(おそらく、これは完全に真実ではありませんが、変更するべきではありません)。

OK、いくつかのコード:

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をクラスユーザーからクラス管理者に変更したい」と言うとき、あなたは正確に何をしようとしていますか?

そのオブジェクトに存在しないオブジェクトのプロパティにアクセスしようとしています。ダウンキャスティングは単にそのようには機能しません。後にそのプロパティの1つを保存するには、タイプAdministratorのオブジェクトをインスタンス化する必要があります。

于 2013-02-11T09:20:17.863 に答える
0

USERを作成する場合は、次のようにUSERのインスタンスを作成する必要があります。

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

管理者もユーザーですが、もう1つのデータ、authoritySelectedがあるため、管理者がユーザーを拡張する場合、管理者もユーザーと同じデータを持ちます。

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 に答える