Rails中HABTM关联异常:为何查询content_brands表?
Rails HABTM跨库关联报错:PG::UndefinedTable: relation "content_brands" does not exist
这个问题我之前处理跨库HABTM关联时也碰到过,核心原因是你给HABTM关联配置的外键参数搞反了,让Rails误解了关联表的结构,所以才会去查询不存在的content_brands表。
问题出在哪?
先拆解你的模型配置问题:
- 在
Brand模型里,has_and_belongs_to_many :contents设置了foreign_key: :content_id——但foreign_key应该指向当前模型(Brand)在关联表中的外键,也就是:brand_id,你完全写反了; - 在
Content模型里,association_foreign_key: :brand_id的搭配也不对,加上前面的外键错误,Rails自动 fallback 到默认表名规则(按模型名字母顺序,Content在前Brand在后,所以生成content_brands),而非你实际创建的brands_contents。
修正后的模型代码
把两个模型的HABTM关联参数调整成这样:
class Brand < ApplicationRecord establish_connection Rails.application.config.dday_companies_database_configuration scope :default_order, -> { order :name } has_and_belongs_to_many :contents, join_table: :brands_contents, foreign_key: :brand_id, # Brand在关联表中的外键 association_foreign_key: :content_id # Content在关联表中的外键 end class Content < ApplicationRecord has_and_belongs_to_many :brands, class_name: 'Brand', join_table: :brands_contents, foreign_key: :content_id, # Content在关联表中的外键 association_foreign_key: :brand_id # Brand在关联表中的外键 end
额外注意点
- 你的迁移是正确的:Rails HABTM默认关联表名是两个模型名按字母升序排列,所以
brands_contents完全符合规则; - 因为Brand模型在另一个数据库,要确保
brands_contents表建在Content模型所在的数据库里——Rails会从当前模型(Content)的数据库去查询关联表; - 如果外键字段都是默认的
xxx_id格式,其实可以只指定join_table,但跨库场景下明确写出foreign_key和association_foreign_key能避免很多隐性问题。
改完之后再试c.brands.first,应该就能正常返回关联数据了。
内容的提问来源于stack exchange,提问作者Roberto Pezzali
相关产品推荐
相关产品推荐

