You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails查询has_one关联active_post匹配指定数组的Blog问题

问题根因

你直接使用Blog.where(active_post: list_of_posts)时,Rails的隐式关联查询语法只会解析active_post的外键关联逻辑,不会自动应用你在has_one :active_post关联定义时绑定的status_code = 'active'过滤、按created_at倒序取最新的scope约束,所以最终的查询只会匹配所有关联了列表内任意Post的Blog,不会做额外限制。

解决方案

根据你的实际需求可以选择以下两种实现方式:

场景1:仅要求Blog存在至少一个处于active状态、且属于指定列表的Post

直接通过joins加载active_post关联即可,joins会自动应用关联绑定的所有scope约束:

# 先提取目标Post的ID集合
target_post_ids = list_of_posts.pluck(:id)
# joins关联时会自动带上status_code = 'active'的过滤条件
matched_blogs = Blog.joins(:active_post).where(posts: { id: target_post_ids })

场景2:要求Blog的最新active状态Post刚好属于指定列表

如果需要严格匹配active_post关联的“取最新记录”逻辑,需要借助窗口函数先过滤出每个Blog的最新active Post,再做匹配:

# 先筛选出每个Blog排名第一的active Post,且该Post属于指定列表
latest_valid_posts = Post.where(status_code: 'active', id: list_of_posts.pluck(:id))
                         .select("id, blog_id, ROW_NUMBER() OVER (PARTITION BY blog_id ORDER BY created_at DESC) AS post_rank")
                         .having("post_rank = 1")
                         .group(:id, :blog_id)

# 关联查询对应的Blog
matched_blogs = Blog.joins(:posts).merge(latest_valid_posts).distinct

内容的提问来源于stack exchange,提问作者Hannah__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:09:05