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

Rails如何筛选未关联指定项目的开发者?现有代码错误展示已关联人员

问题根源

  • 现有逻辑混淆了中间关联表和用户表的查询边界:你当前查询的@project_developer是ProjectsDeveloper中间关联表的记录,而非User表的开发者账户
  • 过滤规则完全不匹配:where.not(id: @users.ids)是拿中间表的自增主键和用户ID做对比,二者没有对应关系,过滤逻辑完全失效
  • 没有按当前项目ID筛选已关联的开发者,自然会出现已关联的开发者仍出现在列表中的问题

修正后的控制器代码

def index
  # 优先查询当前项目实例
  @project = Project.find(params[:project_id].to_i)
  # 查询当前项目已关联的所有开发者ID
  associated_developer_ids = ProjectsDeveloper.where(project_id: @project.id).pluck(:developer_id)
  # 过滤出身份为开发者、且未和当前项目关联的用户
  @available_developers = User.where(user_type: :developer).where.not(id: associated_developer_ids)
end

修正后的视图代码

<% @available_developers.each do |user| %>
   <h3><%= user.id %><%# 可替换为 user.name 等实际展示用的用户名字段 %></h3>
   <%= button_to 'Assign' , projects_developer_index_path({project_id: @project.id, developer_id: user.id}),
         method: :post %><br>
<% end %>

可选优化(符合Rails规范写法)

你可以先给模型补充关联关系,简化后续查询:

  1. 在Project模型中添加关联:
has_many :projects_developers
has_many :developers, through: :projects_developers, class_name: 'User'
  1. 控制器查询已关联开发者ID可简化为:
associated_developer_ids = @project.developers.ids
  1. 数据量较大时可改用子查询写法,减少一次数据库请求:
@available_developers = User.where(user_type: :developer)
                            .where.not(id: ProjectsDeveloper.select(:developer_id).where(project_id: @project.id))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:24:03