首页 > 解决方案 > 需要帮助重写一些最初用名为 Squeel 的 gem 编写的 Rails DB 查询,有工作的 SQL

问题描述

我有几个非常困难的数据库查询,我需要帮助才能以正确的方式为 Rails 6 Active Record 重写。这些目前正在一个应用程序中工作,我正在重写新版本的 Ruby on Rails (6.1.4.2)。

它最初是在 Rails v3.2 上编写的,带有一个名为 squeel 的地狱 gem,它使用自己的 DSL 语言。

https://github.com/activerecord-hackery/squeel

我已经尝试了几天,但无法弄清楚。我第一次问它时,我可能没有我需要的那么清楚。所以这次我将把查询放在 squeel 中写的那样,以及 Heroku 控制台吐出的 SQL,仅此而已。如果有人想要任何其他信息,请询问,我会很乐意发布。我想保持简单,因为它们足够令人困惑。

警告:这些似乎非常复杂。任何帮助将不胜感激!:)

这是 squeel DB 查询 1:

Project.joins{vendor}.joins{certifications.outer}.where{
        (projects.vendor_id.eq my{ vendor_id }) |
        (vendors.parent_vendor_id.eq my{ vendor_id }) |
        ((certifications.cdti == true) & (certifications.published == true))
      }.uniq

这是 Rails v3.2 中查询 1 的海峡 SQL:

SELECT DISTINCT "vendors".* FROM "vendors" INNER JOIN "projects" ON "projects"."vendor_id" = "vendors"."id" 
INNER JOIN "certifications" ON "certifications"."project_id" = "projects"."id" 
WHERE (("certifications"."cdti" = 't' AND "certifications"."published" = 't')) 
ORDER BY "vendors"."parent_vendor_id", "vendors"."name"

这是 squeel DB 查询 2:

Fleet.joins{vendor.projects.certifications}.
        where{(certifications.cdti.eq true) & (certifications.published.eq true)}.
        uniq.includes(:vendor).
        order(:vendor_id, :name)

这是 Rails v3.2 中查询 2 中的海峡 SQL:(我在几个地方按了 Enter,这样您就可以看到整个语句而不必向右滚动

SELECT DISTINCT "fleets".* FROM "fleets" INNER JOIN "vendors" ON "vendors"."id" = "fleets"."vendor_id" 
INNER JOIN "projects" ON "projects"."vendor_id" = "vendors"."id" 
INNER JOIN "certifications" ON "certifications"."project_id" = "projects"."id" 
WHERE (("certifications"."cdti" = 't' AND "certifications"."published" = 't')) 
ORDER BY "fleets"."vendor_id", "fleets"."name"

再说一次,如果有人想看或知道其他任何事情,请告诉我,因为我正在尽力解决这个问题,但是这些似乎太先进了,我只是不认为我知道正确的语法。

谢谢你的时间,斯科特

标签: ruby-on-railsdatabaseactiverecord

解决方案


查询 1 等效项是:

Vendor.joins(projects: :certifications).where(certifications: { cdti: 't', published: 't' }).order(:parent_vendor_id, :name).distinct

查询 2:

Fleet.joins(vendor: { projects: :certifications }).where(certifications: { cdti: 't', published: 't' }).order(:vendor_id, :name).distinct

推荐阅读