You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6替换Squeel查询时出现CollectionProxy无call方法报错问题

你重写的查询语法不符合Rails 3.2的ActiveRecord规范,这是触发报错的直接原因。

存在的语法错误

  • joins(vendor)写法错误,关联名需要作为符号传入,正确写法是joins(:vendor)
  • projects.(:vendor_id)、my.(:vendor_id)属于无效语法,ActiveRecord没有这种属性引用方式
  • 直接在查询语句中写OR关键字不符合ActiveRecord的API规范,Rails 3.2原生不支持链式OR调用,需要用Arel构造条件

正确的查询实现

# 以下代码可直接替换原squeel查询,假设当前上下文可获取到要匹配的vendor_id变量
projects_arel = Project.arel_table
vendors_arel = Vendor.arel_table

match_condition = projects_arel[:vendor_id].eq(vendor_id).or(
  vendors_arel[:parent_vendor_id].eq(vendor_id)
)

Project.joins(:vendor).where(match_condition).uniq

报错原因说明

你写的projects.(:vendor_id)语法在Ruby中会被解析为尝试调用projects.call(:vendor_id),而你代码中的projects是ActiveRecord::Associations::CollectionProxy对象,没有call方法,因此触发了对应的报错。

注意事项

原squeel语法中的my{ vendor_id }作用是获取当前上下文的vendor_id变量,你只需要将示例中的vendor_id替换为实际上下文中的变量名即可。比如这段逻辑如果是定义在User模型的authorized_projects方法中,就替换为self.vendor_id。
如果调整后仍有问题,可以补充User、Project、Vendor三个模型的关联定义代码做进一步定位。

内容的提问来源于stack exchange,提问作者Scott Milella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:54:01