Сохранение связанных классов домена в Grails - PullRequest
1 голос
/ 25 июня 2009

Я изо всех сил пытаюсь получить ассоциацию прямо на Grails. Допустим, у меня есть два класса домена:

class Engine {
    String name
    int numberOfCylinders = 4
    static constraints = {
        name(blank:false, nullable:false)
        numberOfCylinders(range:4..8)
    }
}

class Car {
    int year
    String brand
    Engine engine = new Engine(name:"Default Engine")
    static constraints = {
        engine(nullable:false)
        brand(blank:false, nullable:false)
        year(nullable:false)
    }
}

Идея заключается в том, что пользователи могут создавать автомобили без предварительного создания двигателя, и эти автомобили получают двигатель по умолчанию. В CarController у меня есть:

def save = {
    def car = new Car(params)
    if(!car.hasErrors() && car.save()){
        flash.message = "Car saved"
        redirect(action:index)
    }else{
        render(view:'create', model:[car:car])
    }
}

При попытке сохранить я получаю исключение нулевого значения в поле Car.engine, поэтому очевидно, что механизм по умолчанию не создается и не сохраняется. Я пытался вручную создать движок:

def save = {
    def car = new Car(params)
    car.engine = new Engine(name: "Default Engine")
    if(!car.hasErrors() && car.save()){
        flash.message = "Car saved"
        redirect(action:index)
    }else{
        render(view:'create', model:[car:car])
    }
}

тоже не сработало. Разве Grails не может сохранять связанные классы? Как я мог реализовать такую ​​функцию?

Ответы [ 2 ]

3 голосов
/ 30 апреля 2010

Я думаю, что вам нужно принадлежать в вашем движке, т.е.

static belongsTo = [car:Car]

Надеюсь, это поможет.

2 голосов
/ 26 июня 2009

За то, что стоит, я, наконец, прибил его.

Исключение, которое я получил при попытке сохранить автомобиль, было

свойство not-null ссылается на ноль или переходное значение

Было очевидно, что двигатель был нулевым при попытке сохранить, но почему? Оказывается, вы должны сделать:

def car = new Car(params)
car.engine = new Engine(name: "Default Engine")
car.engine.save()

Так как двигатель не принадлежит автомобилю, вы не получите каскадное сохранение / обновление / удаление, что хорошо в моем случае. Решение состоит в том, чтобы вручную сохранить двигатель, а затем сохранить автомобиль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...