查询关联数据时,热切的负载关联

时间:2019-04-16 07:42:43

标签: ruby-on-rails activerecord rails-activerecord

我有一个模型“ User”,它与另一个模型“ Membership”具有一对多的关系。成员资格具有一个名为“ group”的字段,该字段具有一个组的名称。我想查询特定“组”中的所有用户记录,并渴望为返回的每个用户加载所有“成员身份”。

在继续之前,我知道通常您将实现“组”模型并使Membership成为User和Group之间的联接表,并仅查询特定Group的所有用户。这个例子有些人为,但是它代表了我正在研究的真实情况。

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

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

但是,尽管这将返回正确的用户,但它只渴望加载与查询匹配的成员资格。换句话说,如果用户“ Bob”在“红色”和“蓝色”组中,并且我查询所有“蓝色”组用户,则结果中将返回用户“ Bob”,但仅返回其“蓝色”组成员资格已加载。

是否有一种方法可以通过单个数据库查询并渴望加载每个返回用户的所有成员身份?

1 个答案:

答案 0 :(得分:2)

在您的示例中,因为关联上存在查询条件,所以执行单个数据库查询。通常,includes将执行两个数据库查询,一个查询加载用户,另一个加载关联的成员身份。

我之所以注意,是因为有一个解决方案可以执行两个数据库查询,而且很好(默认的ActiveRecord急于加载行为)

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

注意:在示例中,使用preload方法而不是includes。也就是说,关联表上的查询条件仅在第一个查询中应用,而不会影响预加载memberships的第二个查询。默认情况下,当关联表include上没有额外的查询条件时,其工作方式类似于preload

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

第二个查询将在没有任何额外条件的情况下获取所有关联的成员资格。