Ruby on rails ActiveRecord:使用unscoped进行连接不会跳过默认的\u范围

Ruby on rails ActiveRecord:使用unscoped进行连接不会跳过默认的\u范围,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,在执行ActiveRecord连接时,尝试跳过默认的\u范围时,我遇到了一些问题 尽管代码库相当大,但我只是展示了一些基本知识,因为我认为这很好地说明了问题所在: 类客户端 属于:公司 终止 阶级公司 默认范围{whereversion\u id:nil} 终止 我正在构建一个复杂的报表,所以我需要连接多个表并对它们进行筛选。但是,在获取客户端时,我无法成功跳过默认范围 Client.joins:company.to_sql 选择客户。*从客户内部加入公司 ON companys.id=clie

在执行ActiveRecord连接时,尝试跳过默认的\u范围时,我遇到了一些问题

尽管代码库相当大,但我只是展示了一些基本知识,因为我认为这很好地说明了问题所在:

类客户端 属于:公司 终止 阶级公司 默认范围{whereversion\u id:nil} 终止 我正在构建一个复杂的报表,所以我需要连接多个表并对它们进行筛选。但是,在获取客户端时,我无法成功跳过默认范围

Client.joins:company.to_sql 选择客户。*从客户内部加入公司 ON companys.id=clients.company\u id和companys.version\u id为空 如您所见,这将自动包括公司默认的\u范围。所以我试了一下:

Company.unscoped{Client.joins:Company}.to_sql 选择客户。*从客户内部加入公司 ON companys.id=clients.company\u id和companys.version\u id为空 再一次,我得到了同样的结果,即使在块中使用unscoped

然后,我决定在模型中添加一个新的关联,其范围不受限制:

类客户端 属于:公司 属于:unscoped_company,->{unscoped},外键::company_id,类名:company 终止 加上这些,我又试了一次:

Client.joins:unscoped_company.to_sql 选择客户。*从客户内部加入公司 ON companys.id=clients.company\u id和companys.version\u id为空 但仍在应用范围

您知道如何在不应用默认\u范围的情况下成功地联接两个表吗? 删除默认的_范围不是一个选项,因为它是一个大型应用程序,更改它将需要太多时间

Rails v4.2.7


Ruby v2.2.3

您可以手动执行:

Client.joins('inner join company on companies.id = clients.company_id')
Client.joins("INNER JOINS companies ON companies.id = clients.company_id).to_sql

直接作为类方法应用

Client.unscoped.joins(:company).to_sql

我做了一些研究,但没有找到任何直接的解决办法

这里有几个变通办法。我不能说他们是否会在你的链式连接中工作。 首先,手动操作:

Client.joins('inner join company on companies.id = clients.company_id')
Client.joins("INNER JOINS companies ON companies.id = clients.company_id).to_sql
其他选项定义从公司继承的CompanyScope类,删除默认的\u范围:

class CompanyUnscoped < Company

  self.default_scopes = []

end
那你就可以打电话了

Client.joins(:company_unscoped)
#=> SELECT "clients".* FROM "clients" INNER JOIN "companies" ON "companies"."id" = "clients"."company_id"

你可以试试,但我本来希望能工作的。您可以在不使用块的情况下再次尝试,在应用了不需要的作用域之后再使用它。

似乎没有任何您想要的简单解决方案。这里有几个讨论主题供参考


但是我喜欢@iGian所建议的方式。

谢谢Jon,但即使这个例子还可以,在我的例子中,我有很多连接要做,我想在ActiveRecord上做,否则我需要手动完成。你真的需要默认范围吗?如果删除它,你得到预期的结果,考虑使用范围::unVelosi--{{WeVistuxId:nI}。是的,我想删除它,但这不是一个选项,现在需要花费很多时间来重构感谢,但它不起作用…它仍在增加公司的加入范围。谢谢@iGian。尽管我并不完全喜欢这个解决方法,但它非常有效,所以我认为它是正确的答案。谢谢你的帮助!