1

Groovy nd Grails の初心者です。外部キーを子テーブルに保存する方法がわかりません。Person と Telephone という 2 つのドメイン クラスがあります。保存しようとしましたが、うまくいきません。助けてください。

Person.groovy

class Person {

    String name
        String password        
    static constraints = {
        name(blank:false)
                password(blank:false)
    }
    static hasMany = [telephone:Telephone]
    @Override
    public String toString() {
        // TODO Auto-generated method stub
    name
    }
}

Telephone.groovy

class Telephone {

    String number
    Person person
    static constraints = {
        number(blank:false)
        person()
    }
    static belongsTo = [person:Person]
    @Override
    public String toString() {
        // TODO Auto-generated method stub
    number
    }
}

セッション変数に格納されたログイン個人 ID。

session.setAttribute("user_id")

次に、番号を保存しようとしました。

TelephoneController.groovy

class TelephoneController {

     def index() {
        redirect(action:'create')
         }
    def create(){

    }
def save(){
        def number=new Telephone(params)
        int user_id=Integer.parseInt(session.getAttribute("user_id").toString())
                params.person=user_id       
        if(!number.hasErrors() && number.save()){
            println "save"
            flash.toUser="Person Details [${number.number}] has been added."
            redirect(view:'create')
        }
    }
}

しかし、うまくいきません。助けてください。

4

2 に答える 2

1

私は1番目の答えに同意します。コードを過度に複雑にしました。個人用に多くの電話番号のみを保存したい場合は、次のようなもので十分です。

class Person {

    String name
    String password

    static hasMany = [phoneNumbers:String]

    static constrains = ...
}

基本的に、Person の番号のリストのみを格納するために別のドメイン クラスは必要ありません。次に、コントローラーで次のことを行う必要があります。

    def save() {
        int user_id = session['user_id'] // no need to parse, Groovy will handle
        def user = Person.get(user_id) // you need to fetch the Person from database (the same applies when using additional Telephone)
        user.phoneNumbers << params.newNumber // the << operator acts here like add(String) method
        user.save()
    }

別の Telephone クラスを使用することにした場合、次のようになります。

    def save() {
        int user_id = session['user_id']
        def user = Person.get(user_id)
        def number = new Telephone(params)
        number.person = user // important to create relation
        number.save() // pay attention here, that in previous example the Person was saved, but now the Telephone is
    }

また、静的な belongsTo = [person:Person] を使用する場合、Telephone クラスで Person フィールドを宣言する必要はありません。とにかくプロパティが作成されます。

最後のヒントとして、ドメイン クラスを作成したら、コマンド grails generate-all Person を実行してみてください (まだ grails generate-all Telephone を使用している場合)。これにより、ドメイン クラスのデフォルトのコントローラとビューが「足場」になり、例として使用できます。

于 2012-09-13T11:02:10.553 に答える
0

あなたのコードは少し複雑すぎるように見えます。あなたの目標はもっと簡単に達成できるはずです。あなたが使用している1対多の関係を説明しているGrailsのドキュメントを調べてみてください: http://grails.org/doc /latest/guide/GORM.html#oneToMany

于 2012-09-13T09:14:53.687 に答える