Как мне выбрать модель домена в этом случае?

Мне нужно разработать приложение для управления пользователями в ИТ-проекте. Это делается для того, чтобы изучить Grails. У меня есть проблема, с которой нужно начать:

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

Теперь... Когда дело доходит до моделирования предметной области, как я на самом деле это моделирую? Я придумал решение моделирования примерно так:

class User { 
        //relationships. . . . 
        static belongsTo = [ company : Company, role : Role, resource : Resource] 
        static hasMany = [ holidays : Holiday, tasks : Tasks ] 
        Profile profile 
        Project project 
        String login 
        String password 
        static constraints = { 
                login(unique:true,size:6..15) 
                profile(nullable:true) 
        } 
        String toString() { 
                this.login 
        } 
} 

Теперь воспользуемся скаффолдингом Grails. Я сгенерировал представление, хммм, вот где меня поразило!

С этой моделью, очевидно, при создании нового пользователя мне нужно предоставить детали проекта, сведения о ресурсах. Несмотря на то, что я могу изменить вид, как мне нужно, например, мне нужно только два поля, логин и пароль, чтобы новый пользователь зарегистрировал мой сайт. Но в соответствии с моделированием данных, как я могу обрабатывать другие поля, такие как профиль, проект и другие отношения. Это звучит сложно! Я знаю, что я новичок в веб-разработке, и мне нужны ваши предложения, и как мне это сделать?

Заранее спасибо.


person Ant's    schedule 27.12.2011    source источник
comment
попробуйте grails.org/doc/2.0.x/ref/Domain %20Classes/hasOne.html с профилем, проектом и каркасом всех классов вашего домена.   -  person Ray Tayek    schedule 27.12.2011


Ответы (1)


Вам нужно переопределить действие save в вашем контроллере и заполнить там эти дополнительные поля.

Попробуйте добавить следующий код в UserController:

def save = {
    def userInstance = User.get(params.id)
    if (!userInstance) {
        userInstance = new User()

        // here you can fill in additional fields:
        userInstance.profile = myMethodToGetTheProfile()
        userInstance.project = myMethodToGetTheProject()
        ...
    }
    userInstance.properties = params
    if (userInstance.save(flush: true)) {
        flash.message = message(code: 'default.created.message', args: [message(code: 'User.propertyName.label', default: 'User'), userInstance.id])}
        redirect(action: session.lastActionName ?: "list", controller: session.lastControllerName ?: controllerName)
    } else {
        render(view: "form", model: [userInstance: userInstance, mode: 'edit'])
    }
}

Реализация методов для получения проекта по умолчанию зависит от логики вашего приложения.

person socha23    schedule 27.12.2011
comment
+1 хорошо :) и вот что я сделал. Я создал статические леса для требуемого класса. И в конкретном _form.gsp я добавил соответствующие поля формы в соответствующие классы через поля html и gsp. Например, при создании User я поместил поля Profile в ту же форму (поскольку между этими двумя классами существует связь, используя синтаксис вроде profile.name и т. д.). И это работает отлично. Теперь мой вопрос: что я сделал, это хорошая практика? Или плохой? - person Ant's; 27.12.2011
comment
Я думаю, это хорошая практика. Однако не забудьте проверить переданные параметры, поскольку пользователи могут подделывать значения, записанные в поля формы (и таким образом, например, получать доступ к другим проектам). - person socha23; 27.12.2011