我看过这个rails cast http://railscasts.com/episodes/22-eager-loading但是我仍然对于为这样的场景编写高效的GET REST服务的最佳方法有一些困惑:
假设我们有一个组织表,并且有二十个其他表,它们之间存在belongs_to
和has_many
关系。 (所以这些表都有 organization_id 字段)。
现在我想以Rails REST服务的形式编写GET和INDEX请求,该服务基于在URL中传递给请求的组织ID,它可以去读取那些表并填充JSON但不是全部那些表,仅针对其中的一些,例如,让我们说患者,订单和访问表,而不是所有这20个表。
所以我仍然无法理解如何编写这样的
.find( :all )
有点查询? 有人可以展示一些例子,这样我就能理解如何进行这类查询吗?
答案 0 :(得分:2)
您可以在一个SQL查询中包含所有这些表:
@organization = Organization.includes(:patients, :orders, :visits).find(1)
现在,当您执行以下操作时:
@organization.patients
它会将患者加载到内存中,因为它已经在原始查询中获取了它们。如果没有includes
,@organization.patients
将触发另一个数据库查询。这就是为什么它被称为“急切加载”,因为你在实际引用它们之前加载组织的patients
(急切地),因为你知道你以后会需要这些数据。
您可以随时使用includes
,无论是否使用all
。我个人认为,当我将includes
方法链接到模型上时,它更明确和清晰,而不是将其包含在某种哈希选项中(如Railscast剧集中)。