首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails HABTM查询仅返回匹配的关联

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

Stack Overflow用户
提问于 2020-10-10 20:30:30
回答 1查看 32关注 0票数 1

我正在试着在他们的关联上创建一个记录过滤器。所以我有创造力,他们有多种才能。我想有一个av视图,过滤与特定人才的创意。但仍然在视图中显示每个创意的多个天赋。

代码语言:javascript
运行
复制
class Creative
  has_and_belongs_to_many :talents
end

Creative -> HABTM ->人才

代码语言:javascript
运行
复制
@creatives = Creative.includes(:talents, user: [:profile_image_attachment])
@creatives = @creatives.where(talents: { id: searched_talent_id })

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

所以渲染:

代码语言:javascript
运行
复制
<% @creatives.each do |creative| %>
  <% creative.talents.each do |talent| %>
    <%= talent.name %>
  <% end %>
<% end %>

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

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

代码语言:javascript
运行
复制
<% @creatives.each do |creative| %>
  <% creative.talents.all.each do |talent| %>
    <%= talent.name %>
  <% end %>
<% end %>

然后我确实得到了所有的天赋,但数据库中有每个创意的查询。我能避免这种情况吗?例如,渴望加载所有的创意人才,而不是被我搜索的那个所限制!

EN

回答 1

Stack Overflow用户

发布于 2020-10-12 04:50:51

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

代码语言:javascript
运行
复制
@creatives = Creative.includes(:talents, user: [:profile_image_attachment])
        .where(
          id: Creative.joins(:talents)
                      .where(talents: { id: searched_talent_id })
        )

这将创建以下SQL:

代码语言:javascript
运行
复制
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读取的行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64293437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档