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__
相关产品推荐
相关产品推荐

