Rails has_many检索所有记录

时间:2015-12-03 16:24:05

标签: ruby-on-rails ruby-on-rails-4 has-many

# Events
has_many :attendees

# Attendees
belongs_to :event

如何使用每个活动的参加者访问所有活动?
Event.all.attendees # obviously does not work

要为1个活动做这个,我们可以做到 Event.find(1).attendees
我们怎样才能为所有活动做到这一点?有自动化方式还是我们需要循环?

2 个答案:

答案 0 :(得分:2)

是。有。关于AR查询方法的Have a read

有两种主要方法可供查看:

joinsincludes

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