Rails自定义关联键问题:关联查询返回nil的修复方法
问题修复方案
嘿,我一眼就发现问题所在了!你的关联配置没匹配到正确的字段对应关系,导致Rails生成了错误的查询语句。
问题根源
默认情况下,Rails的belongs_to关联会用[关联名]_id(这里本该是activity_feed_id)去关联目标模型的主键id。但你的ActivityTour里存的是activity_id,而且这个字段对应的是ActivityFeed的activity_id字段(不是它的主键id),所以当你调用b.activity_feed时,Rails会错误地用123去查询ActivityFeed的id字段,自然找不到对应记录,返回nil。
修复步骤
你需要明确指定关联的外键和主键,让Rails清楚字段的对应关系:
- 修正
ActivityTour的关联
class ActivityTour < ApplicationRecord belongs_to :activity_feed, foreign_key: :activity_id, primary_key: :activity_id end
foreign_key: :activity_id:告诉Rails用ActivityTour的activity_id字段作为关联外键primary_key: :activity_id:指定关联到ActivityFeed的activity_id字段,而非默认的id
- 同步修正
ActivityFeed的关联
为了保证双向关联正常工作,ActivityFeed的has_many也需要对应调整:
class ActivityFeed < ApplicationRecord has_many :activity_tours, foreign_key: :activity_id, primary_key: :activity_id end
额外建议
如果业务允许,最好遵循Rails的命名约定:把ActivityTour里的关联字段改成activity_feed_id,这样就不用手动指定foreign_key和primary_key,Rails会自动匹配关联关系,代码也更简洁。但如果因为现有业务逻辑必须保留activity_id字段,上面的修复方案就能完美解决你的问题。
内容的提问来源于stack exchange,提问作者AngryCat
相关产品推荐
相关产品推荐

