我正在试着在他们的关联上创建一个记录过滤器。所以我有创造力,他们有多种才能。我想有一个av视图,过滤与特定人才的创意。但仍然在视图中显示每个创意的多个天赋。
class Creative
has_and_belongs_to_many :talents
end
Creative -> 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 %>
然后我确实得到了所有的天赋,但数据库中有每个创意的查询。我能避免这种情况吗?例如,渴望加载所有的创意人才,而不是被我搜索的那个所限制!
发布于 2020-10-12 04:50:51
您可以使用子查询来解决此问题:
@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
读取的行。
https://stackoverflow.com/questions/64293437
复制相似问题