2015-10-20 3 views
0

Я изучаю grails, и я придумал прецедент. В моем случае использования у продукта много пользователей, и каждый пользователь может иметь много ролей.Моделирование доменов с использованием GORM в grails, как представить ассоциацию

Вот мой класс продукта:

class Product { 

    String name 
    String description 
    String vision 
    Date startDate 
    Date endDate 

    static hasMany = [users : User, contributors : User, watchers : User, approvers : User] 
    static belongsTo = User 

    static constraints = { 
    } 
} 

Вот мой класс User:

class User { 

    static constraints = { 
    } 

    String fullName 
    String email 

    static hasMany = [roles : Roles, products : Product] 
} 

Вот Роли Enum:

public enum Roles { 
    PRODUCTOWNER ('ProductOwner'), 
    APPROVER ('Approver'), 
    CONTRIBUTOR ('Contributor'), 
    WATCHER ('Watcher') 
} 

Мой вопрос именно об ассоциации между Продуктом и Пользователем. Я хочу представить, что продукт может иметь много пользователей в разных ролях. Кроме того, каждый пользователь может быть частью нескольких продуктов с другой ролью в каждом продукте. Это правильный способ представить эти отношения? Кроме того, я должен уметь удалять и добавлять пользователей к продуктам и наоборот. Это также означает, что пользователи могут перемещаться между ролями и могут перемещаться внутри и снаружи продуктов. В этом случае я, вероятно, не хочу, чтобы каскады произошли. Как предотвратить автоматические каскады для выполнения операций CRUD для этих отношений?

Спасибо.

ответ

1

Я думаю, что вместо того, чтобы иметь роли и продукты в User.groovy, будет лучше создать отдельный домен, такой как UserProductRole. Как вы сказали, пользователь будет иметь различную роль в различных продуктах, то создание отдельного домена имеет больше смысла в бизнес USECASE, а также делать запросы

class UserProductRole{ 

    Role role 

    static belongsTo = [user:User,product:Product] 

    static constraints = { 
     user (unique:['product','role'] 
    } 
} 

Вы можете создать составной ключ, но я обычно Dont perfer, потому что это делает запрос немного сложнее ,

А теперь вам нужно изменить hasMany в пользователя и продукт, как следующие

[userProducts: UserProductRole], а затем, имеющие пользователей или продукты

+0

Это здорово. Позвольте мне сказать это. Для моих нужд я не уникальное ограничение. Я буду играть с этим и обновить здесь. – motiver

Смежные вопросы