2014-09-23 4 views
1

Я новичок в grails. У меня есть 3-х классы, как follwsНабор графических карт Grails из 3 классов

class Cycle 
{ 
    int year 
    int quarter 
} 

class User 
{ 
    String username, password   
}   

class Role 
{ 
    String roleName 
} 

пользователя и таблицы ролей являются независимыми, и они хранятся сведения о всех сотрудниках и Доступные роли соответственно. У сотрудника может быть много ролей в каждом цикле. поэтому я хочу, отображение таблицы как

enter image description here

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

ответ

0

После комментария. Вы должны создать таблицу между Пользователем и Цикла

class UserCycle 
{ 
    User user 
    Cycle cycle 
    static hasMany = [roles: Role] 
} 

класса Роль должна выглядеть следующим образом:

class Role 
{ 
    String roleName 
    UserCycle userCycle 
} 

и в коде Вы можете обратиться к тому, как:

UserCycle uc = ... 
def roles = uc.roles.list(params) //list of roles 
def cycle = uc.cycle 
def user = uc.user 

добавить

uc.addToRoles(/*Your role*/) 

удалить

uc.removeFromRoles(/*Your role*/) 
+0

небольшая коррекция в том, что вы предположили. Пользователь может иметь много циклов и много ролей, Цикл может иметь много пользователей, и каждый пользователь в определенном цикле может иметь много ролей. hope [это изображение] (http://i.stack.imgur.com/8H2Li. jpg) поможет вам понять, что я имею в виду. Также таблица пользователей и ролей - это мастер-таблицы, и они не должны принадлежать ни к каким другим таблицам. То есть пользователи и роли должны иметь возможность создавать самостоятельно. Как только новый цикл будет создан, вы сможете выбрать существующего сотрудника и существующую роль и назначить эту комбинацию пользовательской роли для вновь созданного цикла. –

+0

Итак, если у пользователя может быть много циклов и циклов, у вас может быть много пользователей. создайте таблицу между ними, например UserCycle, которая будет содержать ссылку на одного отдельного пользователя и одну роль. – MNie

+0

также ссылки были бы полезными: https://grails.org/Many-to-Many+Mapping+without+Hibernate+XML http://chrisbroadfoot.id.au/2008/07/19/many-to -many-relationship-mapping-with-gorm-grails/ – MNie

0

Вам нужно добавить таблицы объединения (класс домена), который хранит отображение между пользователями и ролями в конкретном цикле. Вот пример такого класса с некоторыми вспомогательными методами, которые могут быть полезны

class UserRole implements Serializable { 

    User user 
    Role role 
    Cycle cycle 

    static UserRole create(User user, Role role, Cycle cycle, boolean flush = false) { 
     new UserRole(user: user, role: role, cycle: cycle).save(flush: flush, insert: true) 
    } 

    static boolean remove(User user, Role role, Cycle cycle, boolean flush = false) { 
     UserRole instance = UserRole.findByUserAndRoleAndCycle(user, role, cycle) 
     if (!instance) { 
      return false 
     } 

     instance.delete(flush: flush) 
     true 
    } 

    static void removeAll(User user) { 
     executeUpdate 'DELETE FROM UserRole WHERE user=:user', [user: user] 
    } 

    static void removeAll(Role role) { 
     executeUpdate 'DELETE FROM UserRole WHERE role=:role', [role: role] 
    } 

    static void removeAll(Cycle cycle) { 
     executeUpdate 'DELETE FROM UserRole WHERE cycle=:cycle', [cycle: cycle] 
    } 

    static mapping = { 
     id composite: ['role', 'user', 'cycle'] 
     version false 
    } 
} 
+0

Не могли бы вы показать мне, как вставить в эту таблицу. –

+0

Используйте метод 'create' –

+0

Хорошо. будет ли удаление этого цикла или каскада пользователя в этой таблице? –