Rails 5.1多关联模型Where查询报错:PG::UndefinedTable问题
解决PostgreSQL找不到关联表的查询错误
你的问题根源很清晰:你在查询gins表时,WHERE子句直接引用了botanicals表的字段,但没有通过JOIN关联这两个表,PostgreSQL自然不知道botanicals表从何而来,所以抛出了PG::UndefinedTable错误。
结合你的场景(展示包含特定Botanical的Gin列表),这是典型的多对多关联查询问题,我来一步步帮你解决:
1. 先确认模型的多对多关联
首先要确保Gin和Botanical之间的关联定义正确,因为这是后续查询的基础。你需要一个中间表(比如gin_botanicals,包含gin_id和botanical_id两个外键),然后在模型里这样定义:
在gin.rb中:
class Gin < ApplicationRecord has_many :gin_botanicals has_many :botanicals, through: :gin_botanicals end
在botanical.rb中:
class Botanical < ApplicationRecord has_many :gin_botanicals has_many :gins, through: :gin_botanicals end
2. 最简单的查询方式(推荐)
如果是在Botanical的详情页,你肯定已经获取了当前的@botanical实例(比如控制器里写了@botanical = Botanical.find(params[:id])),那直接利用Rails的关联特性就能拿到所有关联的Gin:
@botanical.gins
这会自动生成包含JOIN的正确SQL,完全不需要手动写复杂的WHERE条件,既符合Rails约定,又不容易出错。
3. 手动写查询的正确姿势(如果需要过滤)
如果你因为某些场景必须手动构建查询,一定要记得先用joins关联表,再添加WHERE条件:
# 精确匹配Botanical名称 Gin.joins(:botanicals).where(botanicals: { name: 'angelica root' }) # 模糊匹配(注意用占位符防止SQL注入,不要直接字符串拼接) Gin.joins(:botanicals).where("botanicals.name LIKE ?", "%#{search_term}%")
这样生成的SQL会自动包含gins、gin_botanicals、botanicals三个表的关联语句,就不会再出现找不到表的错误了。
内容的提问来源于stack exchange,提问作者Simon Cooper
相关产品推荐
相关产品推荐

