2012年10月13日 星期六

如何在 Grails 上透過 GORM 實現多對多的關係。(二) 我就是要這樣呼叫

二個類別,LoginUsers 和 Roles,還記得吧。

        LoginUsers aska = new LoginUsers(userid:'aska')
     LoginUsers gina = new LoginUsers(userid:'gina')
     Roles admin_role = new Roles(name:'admin')
     Roles normal_role = new Roles(name:'normal')
     aska.save(flush:true)
     gina.save(flush:true)
     admin_role.save(flush:true)
     normal_role.save(flush:true)
aska 是admin , gina 是一般使用者。簡單來說這個測試就是如此。 我們要做的測試是,從aska,gina的角度加入群組,以及從群組的角度加入使用者。 當然也要從aska與gina的角度來退出群組,以及從群組的角度來刪除使用者。 GORM 是「絕對直觀」派的東西。你先看我下面怎麼寫,就知道「絕對直觀」是指什麼。 我們先來測試從群組的觀點來加入使用者,並且倒過來從使用者的角度來得到群組。

        println 'add aska to admin_role' + admin_role.addUser(aska)
     println 'add gina to normal role '+ normal_role.addUser(gina)
     println 'add aska to normal role' + normal_role.addUser(aska)
     println 'aska should have two roles = '+aska.roles()
     println 'gina should have one role = ' + gina.roles()
     println 'admin user should be aska= ' + admin_role.users()
     println 'normal users should be aska and gina= '+normal_role.users()
我們實作的程式,就是這樣呼叫。也就是說,這樣寫一定是你最滿意的。得到一個群組的物件時,呼叫 addUser 就可以加入user,還有比這樣寫更簡單的方式嗎? 先說一下,這邊的程式一定都不會過,因為這些方法都還不存在。你可能有想到說,多對多不是有「中間」的表格嗎,怎麼都沒看到? 我們在實作的時候,會透過一個中間類別來做處理,這個中間類別對我來說,不應該出現在controller或是service 之中,它不是我們關心的物件。雖然等下他要做很多事! 再來我們測remove

        //test remove 
     normal_role.removeUser(gina)
     println 'remove gina from normal users, now normal role should be only aska = '+normal_role.users()
     normal_role.removeAllUsers()
     println 'remove all users from normal role, now normal role = '+normal_role.users()
     println 'aska should have no groups after unlink all roles' + aska.removeAllRoles()
好,當我們在刪除的時候,要是你是從使用者的角度出發,你只想呼叫removeRole(role) , removeAllRoles()這樣吧。我所謂的「絕對直觀」,就是程式員的本能,如果可以這樣寫就下班有多好,從這個角度來設計就對了。從群組的角度來說,就是 removeUser(user) , removeAllUsers()這樣,反之亦然,找不到更短的寫法了。 在得到使用者的群組亦是 aska.roles() , 得到管理員群組下的人也該是admins.users(),這就是直觀導向的寫法。 下面再從使用者的角度,加入一堆群組。這個在維護畫面中常常見到啊,管理者勾一勾這個人能加入的群組,將群組id送到controller等待寫入db,所以我們也是需要這樣的功能。

        aska.addRoles([1,2])
     println 'add aska to admin and normal group, now aska join : ' +aska.roles()
     println 'add gina to normal role' + gina.addRole(normal_role)
     println 'remove gian from both roles'+gina.removeAllRoles()
     println 'gina should have no roles now'+gina.roles()
     println 'add gina to admin and normal roles '+ gina.addRoles([1,2])
     println 'clear all user from role'
     normal_role.removeAllUsers();
     admin_role.removeAllUsers();
     println 'try to add people to roles.'
     println 'add aska and gina to normal role.'+normal_role.addUsers([1,2])
     println 'add aska to admin role.'+admin_role.addUsers([1])
     println 'test remove user from roles'
     aska.removeAllRoles()
     gina.removeAllRoles()
     println aska.roles()
     println gina.roles()

我不用解釋你也看的懂,這就是我們要的程式,再來下一章要講背後我們要如何實作,以得到這直觀寫法。

沒有留言:

張貼留言