需要帮助重写一些 Rails 数据库查询,这些查询最初是用 gem 称为 Squeel 编写的,有工作 SQL
Need assistance re-writing some Rails DB Queries that were originally written with a gem called Squeel, have the working SQL
我有几个非常困难的数据库查询,我需要帮助以正确的方式为 Rails 6 Active Record 重写。这些目前正在我在 Rails (6.1.4.2) 上重写 Ruby 的新版本的应用程序中工作。
它最初是在 Rails v3.2 上编写的,带有一个叫做 squeel 的地狱 gem,它使用自己的 DSL 语言。
https://github.com/activerecord-hackery/squeel
我已经尝试了好几天了,还是没弄明白。我第一次问它时,我可能没有像我需要的那样清楚。所以这一次我将按照用 squeel 编写的查询进行查询,Heroku 的控制台输出的 SQL 就是这样。如果有人需要任何其他信息,请询问,我很乐意 post。我想从简单开始,因为它们已经够混乱了。
警告:这些似乎非常复杂。
任何帮助将不胜感激! :)
这是 squeel 数据库查询 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 数据库查询 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:
(我在几个地方按下回车键,这样你就可以看到整个语句而不必向右滚动
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
我有几个非常困难的数据库查询,我需要帮助以正确的方式为 Rails 6 Active Record 重写。这些目前正在我在 Rails (6.1.4.2) 上重写 Ruby 的新版本的应用程序中工作。
它最初是在 Rails v3.2 上编写的,带有一个叫做 squeel 的地狱 gem,它使用自己的 DSL 语言。
https://github.com/activerecord-hackery/squeel
我已经尝试了好几天了,还是没弄明白。我第一次问它时,我可能没有像我需要的那样清楚。所以这一次我将按照用 squeel 编写的查询进行查询,Heroku 的控制台输出的 SQL 就是这样。如果有人需要任何其他信息,请询问,我很乐意 post。我想从简单开始,因为它们已经够混乱了。
警告:这些似乎非常复杂。 任何帮助将不胜感激! :)
这是 squeel 数据库查询 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 数据库查询 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: (我在几个地方按下回车键,这样你就可以看到整个语句而不必向右滚动
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