Rails HABTM查询仅返回匹配的关联



我正在尝试对它们的关联创建一个记录过滤器。所以我有创意,他们有多种才能。我想有一个过滤创意与特定人才的av视图。但仍在视野中展示着每一位创意人士的多重才华。

class Creative
has_and_belongs_to_many :talents
end

创意->HABTM->人才

@creatives = Creative.includes(:talents, user: [:profile_image_attachment])
@creatives = @creatives.where(talents: { id: searched_talent_id })

问题是,当显示每个creative时,它只返回匹配的天赋。

因此渲染:

<% @creatives.each do |creative| %>
<% creative.talents.each do |talent| %>
<%= talent.name %>
<% end %>
<% end %>

只显示查询匹配的人才,而不是所有人才。也就是说,有创造力的人有多种才能。

如果我更改代码以包含对.all的调用。

<% @creatives.each do |creative| %>
<% creative.talents.all.each do |talent| %>
<%= talent.name %>
<% end %>
<% end %>

然后我确实得到了所有的天赋,但数据库中每个创意都有查询。我能避免这种情况吗?也就是说,渴望把所有的人才都投入到创造性中,而不是被我所寻找的人所限制!?

您可以使用子查询来解决此问题:

@creatives = Creative.includes(:talents, user: [:profile_image_attachment])
.where(
id: Creative.joins(:talents)
.where(talents: { id: searched_talent_id })
)

这将创建以下SQL:

SELECT 
"creatives".* FROM "creatives" 
WHERE 
"creatives"."id" IN (
SELECT "creatives"."id" 
FROM "creatives" 
INNER JOIN "creatives_talents" ON "creatives_talents"."creative_id" = "creatives"."id" 
INNER JOIN "talents" ON "talents"."id" = "creatives_talents"."talent_id"       
WHERE "talents"."id" = $1
) 
LIMIT $2 

这只会将WHERE子句应用于子查询,而不是.includes获取的行。

最新更新