如何在Rails应用的不同控制器中通过相同ID关联不同变量
Rails 权限匹配通讯数据实现方案
第一步:模型层配置关联(推荐优先做,后续复用性更高)
Rails 默认外键命名规则为模型名_id,你当前字段是communications_id多了后缀s,需要显式指定外键避免关联报错:
# app/models/permission.rb class Permission < ApplicationRecord # 单条权限对应单条通讯记录,若为多对多关系可改为 has_and_belongs_to_many belongs_to :communication, foreign_key: 'communications_id' end # app/models/communication.rb class Communication < ApplicationRecord # 单条通讯记录可对应多条权限 has_many :permissions, foreign_key: 'communications_id' end
第二步:控制器层过滤数据
在负责渲染communications board的控制器动作中,基于权限的communications_id过滤通讯数据即可:
# 示例为CommunicationsController的board动作,可根据你的实际业务调整 def board # 从已有的permissions变量中提取所有合规的communications_id,去重 allowed_comm_ids = @permissions.pluck(:communications_id).uniq # 过滤出匹配的通讯数据,空id集合时返回空结果避免查出全量数据 @communications = allowed_comm_ids.present? ? Communication.where(id: allowed_comm_ids) : Communication.none end
第三步:视图层渲染
直接遍历过滤后的@communications变量渲染页面即可,不需要额外做字段匹配判断。
优化建议
- 推荐把字段名改为符合Rails规范的
communication_id,后续不需要额外配置外键,减少踩坑概率 - 给
permissions表的communications_id字段加数据库索引,提升查询效率 - 如果后续权限和通讯是多对多关系,建议新增中间表关联,不要直接在两个模型存外键,扩展性更强
内容的提问来源于stack exchange,提问作者Rogerman64
相关产品推荐
相关产品推荐

