Ruby模型中如何跨表查询miq_user_roles表的settings字段
错误原因
- 关联定义不符合表结构约定:直接声明
has_many :miq_user_roles时,Rails会默认在miq_user_roles表查找service_template_id作为外键,和实际结构不匹配。根据给出的表关系,外键miq_group_id存储在service_templates表,对应miq_user_roles表的主键id,属于多对一关系,应该使用belongs_to定义关联,而非has_many。 - 查询条件未明确字段所属表:直接调用
where(:settings => nil)时,Rails默认从当前模型的service_templates表查询settings字段,必然触发列不存在的错误。
修复方案
1. 调整关联配置
在ServiceTemplate模型现有belongs_to声明块中添加以下代码,手动指定非默认外键:
# 可放在 belongs_to :currency, :inverse_of => false 这行之后 belongs_to :miq_user_role, foreign_key: :miq_group_id
如果需要从MiqUserRole侧反向查询所有关联的服务模板,在MiqUserRole模型中添加反向关联即可:
has_many :service_templates, foreign_key: :miq_group_id
2. 正确编写跨表查询逻辑
关联配置生效后,查询关联表字段需要先连接目标表,再明确指定字段所属表,避免字段歧义:
# 内连接查询:返回所有关联了miq_user_role且该角色settings为nil的服务模板 ServiceTemplate.joins(:miq_user_role).where(miq_user_roles: { settings: nil }) # 左连接查询:包含未关联miq_user_role的服务模板记录 ServiceTemplate.left_joins(:miq_user_role).where(miq_user_roles: { settings: nil }) # 获取单条服务模板对应角色的settings值 service_template = ServiceTemplate.find(xxx) role_settings = service_template.miq_user_role&.settings
代码中
&.是Ruby安全导航操作符,可避免关联记录不存在时调用方法抛出空指针错误。
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

