加载所有数据但不加载所有表

时间:2013-02-07 04:15:51

标签: ruby-on-rails ruby-on-rails-3.2

我看过这个rails cast http://railscasts.com/episodes/22-eager-loading但是我仍然对于为这样的场景编写高效的GET REST服务的最佳方法有一些困惑:

假设我们有一个组织表,并且有二十个其他表,它们之间存在belongs_tohas_many关系。 (所以这些表都有 organization_id 字段)。

现在我想以Rails REST服务的形式编写GET和INDEX请求,该服务基于在URL中传递给请求的组织ID,它可以去读取那些表并填充JSON但不是全部那些表,仅针对其中的一些,例如,让我们说患者,订单和访问表,而不是所有这20个表。

所以我仍然无法理解如何编写这样的

.find( :all )  

有点查询? 有人可以展示一些例子,这样我就能理解如何进行这类查询吗?

1 个答案:

答案 0 :(得分:2)

您可以在一个SQL查询中包含所有这些表:

@organization = Organization.includes(:patients, :orders, :visits).find(1)

现在,当您执行以下操作时:

@organization.patients

它会将患者加载到内存中,因为它已经在原始查询中获取了它们。如果没有includes@organization.patients将触发另一个数据库查询。这就是为什么它被称为“急切加载”,因为你在实际引用它们之前加载组织的patients(急切地),因为你知道你以后会需要这些数据。

您可以随时使用includes,无论是否使用all。我个人认为,当我将includes方法链接到模型上时,它更明确和清晰,而不是将其包含在某种哈希选项中(如Railscast剧集中)。