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
相关产品推荐
相关产品推荐

