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规范写法)
你可以先给模型补充关联关系,简化后续查询:
- 在
Project模型中添加关联:
has_many :projects_developers has_many :developers, through: :projects_developers, class_name: 'User'
- 控制器查询已关联开发者ID可简化为:
associated_developer_ids = @project.developers.ids
- 数据量较大时可改用子查询写法,减少一次数据库请求:
@available_developers = User.where(user_type: :developer) .where.not(id: ProjectsDeveloper.select(:developer_id).where(project_id: @project.id))
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

