ruby-on-rails - 需要帮助重写一些最初用名为 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"
再说一次,如果有人想看或知道其他任何事情,请告诉我,因为我正在尽力解决这个问题,但是这些似乎太先进了,我只是不认为我知道正确的语法。
谢谢你的时间,斯科特
解决方案
查询 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
推荐阅读
- imessage - 如何在 iMessage 中获取 RichLink
- javascript - 如何解决两个javascript弹出窗口冲突?
- python - Python 虚拟环境和空间管理(尤其是 Pipenv)
- react-redux - 根据路线反应更改导航栏颜色
- python - 为什么 Pytorch (CUDA) 在 GPU 上运行缓慢
- javascript - 如果在反应组件中传递了未知道具,如何显示警告?
- google-cloud-firestore - 使用 get( 的 Firestore 安全规则
).id - id 道具不可用? - hyperledger-fabric - 如何在 Hyperledger Composer 中使用 Fabric v.1.2 的“私有数据”?
- google-chrome-extension - 元素未显示在后台页面检查器中并获取 addEventListener 为空错误
- weblogic - 在带有 Solaris OS 的 VM 上安装 weblogic