Ruby on Rails使用遗留数据库时如何设置Active Record的has_many、has_one关联键
Rails 6 遗留数据表Active Record关联配置方案
你的场景属于非标准主键、外键的遗留表关联配置,只需在关联声明时显式指定主键、外键参数即可。
1. 父表模型配置
假设父表对应模型名为Parent,配置如下:
# app/models/parent.rb class Parent < ApplicationRecord # 显式指定父表主键字段,大小写和数据库保持一致 self.primary_key = 'PRN_AUTO_KEY' # 配置has_many关联子表,假设子表模型名为Child has_many :children, foreign_key: 'PRN_AUTO_KEY', # 子表里存储的关联父表的外键字段 primary_key: 'PRN_AUTO_KEY' # 父表用来关联的主键字段 # 配置has_one关联(如需关联单条子记录) has_one :single_child, class_name: 'Child', # 关联模型名,has_one场景如果关联名和模型名不一致需要显式指定 foreign_key: 'PRN_AUTO_KEY', primary_key: 'PRN_AUTO_KEY' end
2. 子表模型配置
假设子表对应模型名为Child,配置如下:
# app/models/child.rb class Child < ApplicationRecord # 显式指定子表主键字段 self.primary_key = 'CHL_AUTO_KEY' # 配置关联父表 belongs_to :parent, foreign_key: 'PRN_AUTO_KEY', # 当前子表里存储的父表外键字段 primary_key: 'PRN_AUTO_KEY' # 父表对应的主键字段 # 如果外键允许为空,需要加 optional: true 关闭Rails默认的关联必填校验 # belongs_to :parent, foreign_key: 'PRN_AUTO_KEY', primary_key: 'PRN_AUTO_KEY', optional: true end
3. 额外注意事项
- 如果实际表名和模型名的复数下划线格式不一致,需要在对应模型中添加
self.table_name = '实际表名'显式指定表名 - 所有字段名、表名的大小写要和数据库中存储的完全一致,避免大小写敏感的数据库(如PostgreSQL默认配置)查询报错
- 可以在Rails控制台通过
Parent.first.children、Child.first.parent的方式验证关联是否正常生效
内容的提问来源于stack exchange,提问作者WarzQ
相关产品推荐
相关产品推荐

