2013-02-28 33 views
0

我有一個事件列表,像這樣添加屬性:如何循環在常規列表,併爲每個對象

事件= Events.all

EventsUsers一個多一對多的關係通過仿照UserEventsapproach from spring-security-plugin

我想找出一個User是否出席一個Event,我可以做到這一點通過運行這個:

UserEvent.get(currentUserId, eventId) 

問題

我怎會這樣在我的名單events的所有元素,因此,我認爲,I層可以很容易地找出是否currentUserId會參加活動嗎?

回答

1

您可以查詢所有相關的User S的一個Event這樣的:

def user = ... 
def events = UserEvent.findAllByUser(user).event 

這是一個相當有效的查詢,因爲它執行類似SQL來

select * from user_event where user_id=? 

和然後加載每個Event。這是N + 1,雖然,因爲它單獨加載每個事件,這樣你就可以用這個更有效地做到這一點:

def eventIds = UserEvent.findAllByUser(user).eventId 
def events = Event.getAll(eventIds) 

第一行只是獲取使用相同的SQL與上述事件ID,那麼第二線運行SQL如

select * from event where id in (?, ?, ?, ...) 
+0

如果'event.getAll(eventIds)'行中的eventIds'爲空,該怎麼辦? - 只要'eventIds'是一個空列表就會導致sql錯誤 – birdy 2013-03-12 15:51:41

+0

使用'def events = eventIds? Event.getAll(eventIds):[]'代替 – 2013-03-12 16:52:21

0

您可以使用grep()根據是否UserEvent.get()返回一個項目來過濾事件列表。

events.grep { UserEvent.get(currentUserId, it.id) } 
1

如果您只需要用戶參加的事件的子集,那麼請使用Burt Beckwith的sugeested。

但是,如果您需要整套事件並只需添加一個屬性,則應該使用metaClass。

event.metaClass.userAttends= ... 

你可以看到解釋有關的metaClass here

特別是在你情我願得到所有ID爲伯特·貝克威思說和每個事件的檢查自己的ID是否在列表中:

def eventIds = UserEvent.findAllByUser(user).eventId 
expandedEvents = events.collect {event-> 
    event.metaClass.usetAttends = eventIds.contains(event.id) 
    return event}