# Events
has_many :attendees
# Attendees
belongs_to :event
如何使用每个活动的参加者访问所有活动?
Event.all.attendees # obviously does not work
要为1个活动做这个,我们可以做到
Event.find(1).attendees
我们怎样才能为所有活动做到这一点?有自动化方式还是我们需要循环?
答案 0 :(得分:2)
是。有。关于AR查询方法的Have a read。
有两种主要方法可供查看:
Event.includes(:attendees)
会加载所有活动及其与会者(无论是否有)
Event.joins(:attendees)
将选择已分配与会者的那些活动。
使用这两个选项,您可以使用块迭代事件的与会者。
只是简短的澄清。我明白,你可能需要一个结果,可以(但永远不应该)以这种方式实现:
Event.all.map(&:attendees) # would return a collection of attendees.
此类查询是邪恶的,因为它们在执行之前已完全加载到内存中。
编辑点 - 你“never”实际上需要这样的东西,比如加载指定参与者的集合。
为什么?
因为如果您需要一组与会者,请使用Attendee
模型,而不是Event
或任何其他相关模型。
这意味着您可以获得满足特定条件的某些活动。
例如:
events = Event.where('start_date > ?' Date.today)
如果您需要此次活动的与会者,您宁愿这样做
Attendee.where(event_id: events.ids)
然后这个
Event.where('start_date > ?' Date.today).map(&:attendees) #inefficient
我希望我能说清楚。
答案 1 :(得分:0)
您可以使用eager loading在几个SQL查询中检索事件及其关联的参与者:
events = Event.includes(:attendees)
events.each do |event|
event.attendees
end