Rails 4查询关联嵌套字段出现Argument can't be converted to a class错误如何解决
Rails 4 嵌套关联条件查询解决方案
你遇到的报错主要由两个问题导致:
- where 条件中使用嵌套关联过滤时,哈希的第一层键需要对应数据库表名,Rails 默认表名是复数形式,你写了单数
manufacturer,无法匹配到对应的表/类,所以抛出转换错误 - 当使用
includes预加载关联的同时需要用关联表字段做过滤时,需要搭配references声明用到的关联表,否则 Rails 不会自动将关联表加入 join 逻辑
场景1:不需要预加载关联数据(仅过滤符合条件的订单)
直接用 joins 关联嵌套表即可:
o = Order.joins(products: :manufacturer).where(manufacturers: { name: n })
场景2:需要预加载 products 和 manufacturer 避免 N+1 查询
两种写法都可以实现需求:
写法1:includes + references 组合
o = Order.includes(products: :manufacturer).references(:manufacturers).where(manufacturers: { name: n })
写法2:直接用 eager_load 一步完成预加载+关联查询
o = Order.eager_load(products: :manufacturer).where(manufacturers: { name: n })
适配 Squeel 语法的写法(从报错栈可看出你引入了 squeel gem)
可以用更简洁的块写法实现查询:
# 仅过滤不预加载 o = Order.joins{products.manufacturer}.where{manufacturer.name == n} # 需要预加载的版本 o = Order.includes(products: :manufacturer).joins{products.manufacturer}.where{manufacturer.name == n}
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

