Elixir Ecto多对多关联查询报错:chataction_readat_id列不存在
Ecto多对多关联查询报错:undefined_column chataction_readat_id 解决方法
问题原因
Ecto默认会根据关联Schema的名称推断多对多中间表的外键名:当你从Chataction关联到ChatactionReadat时,它会默认认为中间表chataction_readat中对应ChatactionReadat的外键是chataction_readat_id,但你的中间表实际使用的是chataction_id(对应Chataction)和其他字段(比如readat_id对应ChatactionReadat),因此查询时会找不到不存在的chataction_readat_id字段。
解决方法
定义多对多关联时,必须显式指定join_keys参数,明确告诉Ecto中间表连接两个Schema的外键具体是什么。
1. 修改Chataction Schema的关联定义
假设你的中间表chataction_readat包含chataction_id(对应Chataction的主键id)和readat_id(对应ChatactionReadat的主键id),修改代码如下:
many_to_many :readat, ChatactionReadat, join_through: "chataction_readat", join_keys: [chataction_id: :id, readat_id: :id]
2. 配置反向关联(若需要)
如果ChatactionReadat中也需要反向关联到Chataction,同样要指定join_keys:
many_to_many :chatactions, Chataction, join_through: "chataction_readat", join_keys: [readat_id: :id, chataction_id: :id]
3. 确认数据库表结构
确保中间表chataction_readat确实包含你指定的外键字段,字段类型与对应Schema的主键类型匹配,且已正确创建外键约束。
验证
修改后重新执行Repo.preload(:readat)查询,Ecto会使用你指定的外键字段进行关联,不会再出现undefined_column错误。
内容的提问来源于stack exchange,提问作者sooon
相关产品推荐
相关产品推荐

