Rails STI关联has_many报错:找不到purchase_offer_wrapper_id列
错误原因及解决办法
核心问题
你仅在PurchaseOffer的belongs_to关联中指定了外键,但**PurchaseOfferWrapper的has_many关联没有同步配置对应的外键规则**,导致Rails按照默认逻辑自动推断出错误的外键名purchase_offer_wrapper_id。
Rails处理has_many关联的默认规则是:
- 外键名 = 当前模型的蛇形名称 +
_id(这里就是purchase_offer_wrapper_id) - 关联模型默认取关联名的单数形式对应的类(这点没问题,但外键规则不匹配你的数据库结构)
修正代码
1. 修正PurchaseOfferWrapper的has_many关联
需要明确指定外键和关联模型类(类名可省略但显式声明更清晰):
class PurchaseOfferWrapper < OfferWrapper has_many :purchase_offers, dependent: :destroy, foreign_key: :offer_wrapper_id, class_name: "PurchaseOffer" end
2. 修正PurchaseOffer的inverse_of配置
inverse_of需要对应has_many的关联名称(复数形式),之前的单数配置不匹配:
class PurchaseOffer < Offer belongs_to :purchase_offer_wrapper, foreign_key: :offer_wrapper_id, inverse_of: :purchase_offers end
验证效果
修改后执行PurchaseOfferWrapper.last.purchase_offers.to_sql,生成的SQL会正确使用offers.offer_wrapper_id作为查询条件,不会再触发列不存在的错误。
内容的提问来源于stack exchange,提问作者Renaud
相关产品推荐
相关产品推荐

