Импорт домена в ограничениях

У меня есть 2 класса домена

class a {
    String name
    static constraints = {
        name unique:true
    }
}

class b {
    String description
}

и в классе домена b я хочу назвать класс a

import a
class b {
    String description
    static constraints = {
         description unique:'a.name'
    }
}

и получить ошибку

Область ограничения [unique] свойства [description] класса [b] должна быть допустимым именем свойства того же класса.

Как перевести недвижимость из класса А в В?


person rsijaya    schedule 12.03.2013    source источник
comment
Описание должно быть уникальным по имени или по идентификатору A? У вас есть отношения между А и Б?   -  person    schedule 12.03.2013
comment
Это не имеет смысла без отношения между А и В.   -  person James Kleeh    schedule 12.03.2013
comment
возможно ли отсутствие связи между А и В? спасибо   -  person rsijaya    schedule 13.03.2013


Ответы (2)


Предположим, вы пытаетесь сделать это в Grails 2+.

Вы не можете использовать проверку таким образом. В вашем примере вам нужно сослаться на свойство того же класса домена. Чтобы исправить ограничение в классе B, вы можете написать:

class B {
    String description
    static contraints = {
        description unique:true
    }
}

Но я думаю, вы хотите импортировать ограничения из класса a, что делается так.

class B {
    String description
    static contraints = {
        importFrom A
    }
}

См. http://grails.org/doc/latest/guide/validation.html#sharingConstraints

Это приведет к импорту всех ограничений свойств, общих для двух классов. Которого в вашем случае нет.


ОБНОВЛЕНИЕ

У меня был аналогичный вопрос, и я нашел решение для него. Поэтому я решил поделиться этим здесь с вами. Проблема может быть решена с помощью пользовательского валидатора. В вашем случае ограничения для класса B:

static constraints = {

    description(validator: {
        if (!it) {
            // validates to TRUE if the collection is empty
            // prevents NULL exception
            return true
        }

        def names = A.findAll()*.name
        return names == names.unique()
    })
}

Трудно ответить правильно на ваш вопрос, так как требования немного странные. Но, может быть, это поможет.

person Bart    schedule 12.03.2013
comment
да, я использую Grails 2.1.1, мне просто нужно проверить, что описание должно быть уникальным на основе класса a.name, спасибо - person rsijaya; 13.03.2013
comment
У меня есть тот же вопрос здесь stackoverflow.com/questions/15371949/ Я дам вам знать, если найду решение - person Bart; 13.03.2013
comment
Я постоянно возвращаюсь к ссылке в этом посте - спасибо! - person pherris; 20.03.2015

Вам нужно написать специальный валидатор, чтобы проверить уникальность, поскольку он зависит от больше информации, чем будет иметь один экземпляр b.

Что-то вроде

static constraints {
     description validator: { val ->
         !a.findByName(val)
     }
}

может сделать трюк.

person doelleri    schedule 12.03.2013
comment
val относится к описанию, не работает, потому что мне нужно сделать описание уникальным на основе класса имени a, пример имя = 1 описание = 1 правда, имя = 2 описание = 1 правда, имя1 описание = 1 ложь, в любом случае спасибо помощь. - person rsijaya; 13.03.2013