查询关联数据时的热切加载关联

问题描述 投票:1回答:1

我有一个模型“用户”,与另一个模型“会员”有一对多的关系。成员资格有一个名为“group”的字段,其中包含一个组的名称。我想查询特定“组”中的所有用户记录,并急切加载返回的每个用户的所有“成员资格”。

在我走得更远之前,我知道通常你会实现一个“组”模型,并使成员资格成为用户和组之间的连接表,并只查询所有用户的特定组。这个例子有点人为,但它代表了我正在研究的真实案例。

无论如何,我尝试了以下查询:

User.includes(:memberships).where(memberships: { group: groupname })

但是,虽然这会返回正确的用户,但它只会急切加载与查询匹配的成员资格。换句话说,如果用户“Bob”处于“红色”和“蓝色”组并且我查询所有“蓝色”组用户,则在结果中返回用户“Bob”但仅返回他的“蓝色”组成员身份已加载。

有没有办法用单个数据库查询执行此操作并且急切加载每个返回用户的所有成员资格?

ruby-on-rails activerecord rails-activerecord
1个回答
2
投票

在您的示例中,执行单个数据库查询,因为关联上存在查询条件。通常,includes会执行两个数据库查询,一个用于加载用户,另一个用于加载相关的成员资格。

我注意到这一点,因为有一个解决方案可以执行两个数据库查询,它很好(默认ActiveRecord渴望加载行为)

User.preload(:memberships).joins(:memberships).where(memberships: {group: groupname})

注意:在示例中,使用preload方法而不是includes。这是因为关联表上的查询条件仅应用于第一个查询,并且不影响预加载memberships的第二个查询。默认情况下,当关联表上没有额外的查询条件时,include就像preload一样工作。

第一个查询将获取具有所需组成员身份的所有用户。

第二个查询将获取所有关联的成员资格,而无需任何额外条件。

© www.soinside.com 2019 - 2024. All rights reserved.