Had to re-write a DB Query for Rails 6 due to Squeel gem: Error: undefined method `call' for #<ActiveRecord::Associations::CollectionProxy []>

Had to re-write a DB Query for Rails 6 due to Squeel gem: Error: undefined method `call' for #<ActiveRecord::Associations::CollectionProxy []>

我最近不得不重新编写一个名为 CtrlPanel 的应用程序,我已经完成并运行良好。 (感谢 Whosebug 上的几位用户提供的帮助!)

我现在进入我必须重写的第二个应用程序,名为 Emissions Gateway。就像 CtrlPanel 一样,这个 WebApp 在其中有一个名为 squeel 的 gem,它使用自己的 Monkey Patched DSL 语言进行数据库查询,所以我必须在 [=39= 上以正常 Ruby 重写所有这些语言] 查询。

这个应用程序有很多这样的查询,它们更复杂,而不是只有几个字段映射到他们使用模型名称和符号名称组合的其他字段。我需要重写所有这些,而我在第一个上遇到了问题。

错误不是我所期望的?如果我理解正确的话,它不会给我查询本身的错误,而是给我关于调用查询的内容的错误?这是错误消息:

#

的未定义方法“调用”

根据 Better Errors 的说法,projects_controller.rb 正在调用:

class ProjectsController < ApplicationController
  load_and_authorize_resource
  def dashboard
    @projects = current_user.authorized_projects.order("created_at desc")
  end

在我开始进行故障排除之前我想确定的是我想知道我的查询重写是否看起来没问题,即使它没有给我语法错误我是当然还有其他问题,我对此还是比较陌生。

这是使用该死的 squeel 语言的原始查询:

#Project.joins{vendor}.where{(projects.vendor_id.eq my{ vendor_id }) |
   (vendors.parent_vendor_id.eq my{ vendor_id })}.uniq

这是我重写的查询:

Project.joins(vendor).where({projects.(:vendor_id) => my.(:vendor_id)}) 
        OR
        ({vendors.(:parent_vendor_id) => my(:vendor_id)}).uniq

我想我会尽量保持简单,只提供最低限度的。 基于以上,我的查询语法是正确的还是我弄错了?我不必在使用 classname.symbole 的 ctrlpanel 上重新编写任何查询,就像此应用程序中的查询一样。如果知道这个 APP 是一个更老的 APP,用 Ruby 2.0 和 Rails 3.2 编写,这对您有帮助。让它启动并最终出现登录提示真是太痛苦了,我在它接受我的登录后立即收到此错误。

如果我需要 post 整个用户模型、项目模型和控制器以及供应商模型,以便能够回答有关我的查询是否正确的问题或揭示有关此错误的更多信息,让我知道,我会添加它们。试图用更简单的术语来保持它,如果可能的话让它更容易,但如果不能做到这一点,我会很乐意提供其余的。

提前感谢任何可以提供帮助的人。

斯科特

感谢@engineersmnky

此查询有效:

Project.joins(:vendor)
       .where(projects: {vendor_id: vendor_id})
       .or(
         Project.joins(:vendor)
                .where(vendors: {parent_vendor_id: vendor_id})
        )

抱歉延迟回复。

非常感谢您的帮助。

斯科特