为什么Ruby on Rails使用.includes()无法加载关联对象?
问题原因
核心原因是模型关联配置的默认外键名,和数据库实际存储的外键列名不匹配:
Rails 中belongs_to :user_detail默认会自动查找eval_forms表中名为user_detail_id的外键列,但你在迁移里实际创建的外键列名为Author_user_details_id,两者不一致导致关联无法匹配到对应数据,始终返回nil。
修复方案
修改两处模型的关联配置,显式指定外键即可:
- 修改
EvalForm模型的关联配置:
class EvalForm < ApplicationRecord # 保留原有其他关联和验证规则 # 替换原有belongs_to :user_detail为以下内容,显式指定外键 belongs_to :user_detail, foreign_key: 'Author_user_details_id' end
如果想要关联名更符合语义,也可以将关联命名为author,后续调用时可以直接用ef.author.DisplayName,可读性更高:
belongs_to :author, class_name: 'UserDetail', foreign_key: 'Author_user_details_id'
- 对应修改
UserDetail模型的反向关联配置:
class UserDetail < ApplicationRecord # 保留原有其他关联 # 替换原有has_many :eval_forms为以下内容,对齐外键设置 has_many :eval_forms, foreign_key: 'Author_user_details_id' # 如果上面EvalForm的关联名改为了author,这里需要补充inverse_of参数 # has_many :eval_forms, foreign_key: 'Author_user_details_id', inverse_of: :author end
可选优化
视图中调用关联属性时可以使用安全调用符&.,避免少数数据异常场景下的报错:
<td><%= ef.user_detail&.DisplayName %></td> <!-- 若关联名改为author则使用以下写法 --> <!-- <td><%= ef.author&.DisplayName %></td> -->
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

