二個類別,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()
我不用解釋你也看的懂,這就是我們要的程式,再來下一章要講背後我們要如何實作,以得到這直觀寫法。
沒有留言:
張貼留言