0

我有一个这样的事件列表:

事件 = Events.all

Events与模仿spring-security-plugin 方法的Usersvia 类具有多对多关系:UserEvents

我想知道 a 是否User正在参加 an Event,我可以通过运行以下命令来做到这一点:

UserEvent.get(currentUserId, eventId)

问题

如何对列表中的所有元素执行此操作,events以便在我的视图层中我可以轻松找出是否currentUserId参加活动?

4

3 回答 3

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 (?, ?, ?, ...)
于 2013-02-28T19:07:32.793 回答
1

如果您只需要用户参加的活动的一个子集,那么就按照 Burt Beckwith 的建议去做。

但是,如果您需要整个事件集并且只添加一个属性,您应该使用 metaClass。

event.metaClass.userAttends= ... 

你可以在这里看到关于 metaClass 的解释

具体来说,在您的情况下,我会像 Burt Beckwith 所说的那样获得所有 id,并检查每个事件的 id 是否在列表中:

def eventIds = UserEvent.findAllByUser(user).eventId
expandedEvents = events.collect {event-> 
   event.metaClass.usetAttends = eventIds.contains(event.id)
   return event}
于 2013-02-28T20:18:21.600 回答
0

您可以使用grep()是否UserEvent.get()返回项目来过滤事件列表。

events.grep { UserEvent.get(currentUserId, it.id) }
于 2013-02-28T17:45:05.670 回答