Граальс составной "уникальное ограничение", но как? - PullRequest
7 голосов
/ 07 ноября 2011

Я очень близок к решению, но что-то все еще не так, надеюсь получить помощь, заранее спасибо.

У меня есть модель домена Клиента, например:

class BoCustomer implements Serializable{

    String firstName
    String lastName
    String emailID
    Company company
}

Итак, у меня есть первичный ключ = "id", все в порядке. Итак, далее мне нужно своего рода уникальное ограничение, которое «проверяет» следующее: «только один уникальный адрес электронной почты для одной компании», чтобы разрешить вставку одного и того же электронного письма, но только для разных компаний. Вставка (test@test.com, идентификатор компании: 1 ) и вставка (test@test.com, идентификатор компании: 1 ) не допускается, но вставка (test@test.com, идентификатор компании: 1 ) и вставка (test@test.com, идентификатор компании: 2 ) разрешено.

Итак, я попробовал:

static mapping = {
    id column: "customer_id", generator: "identity"
    emailcompany composite: ['emailID', 'company'], unique: true
}

(кажется "хорошим", но не совсем то, что я хочу)

НО я не хочу другой столбец, в моей попытке под названием "emailcompany" - но мне нужно что-то вроде уникального ограничения.

Ответы [ 2 ]

8 голосов
/ 08 ноября 2011

Вы можете указать это поведение с помощью одного из основных доступных ограничений: unique

class BoCustomer implements Serializable{

    String firstName
    String lastName
    String emailID
    Company company

    static constraints = {
        emailID(unique: 'company')
            // OR
        company(unique: 'emailID')
    }
}

Вы можете увидеть полную спецификацию ограничения unique здесь http://grails.org/doc/latest/ref/Constraints/unique.html

1 голос
/ 07 ноября 2011

Если вы хотите применить это с ограничением, вы должны иметь возможность использовать пользовательский валидатор, чтобы он возвращал false, если BoCustmer уже существует с тем же emailID и компанией. Прошло много времени с тех пор, как я использовал его, но я думаю, что-то вроде этого должно работать:

class BoCustomer implements Serializable{
    String firstName
    String lastName
    String emailID
    Company company

    static constraints = {
        emailID( 
            validator: { val, obj ->
                def customerWithSameEmailAndCompany = BoCustomer.findByEmailIDAndCompany(obj.emailID, obj.company)
                return !customerWithSameEmailAndCompany
            }
        )
    }
}
...