2013-02-28 68 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}