ruby 在where子句中所有的关联引用都应该是复数吗?

q3qa4bjr  于 2023-05-28  发布在  Ruby
关注(0)|答案(1)|浏览(100)

我正在将Rails 3应用程序升级到Rails 7应用程序。很多在Rails 3(Ruby 1.9.3)中工作的东西在Rails 7(Ruby 3.2.2)中不起作用。尽管我对连接语句和where子句的这种行为感到困惑
运行此查询时:

Request.joins(job: :quote).to_sql

我得到了回应

"SELECT "requests".* FROM "requests"
 INNER JOIN "jobs" ON "jobs"."id" = "requests"."job_id"
 INNER JOIN "quotes" ON "quotes"."job_id" = "jobs"."id""

这是有意义的,一个简单的连接。当我试图在where子句中使用这些关联时,令人困惑的部分出现了,就像这样:

Request.joins(job: :quote).where(job: {quote: {attachment_updated_at: nil}}).to_sql

这给了我:

"SELECT "requests".* FROM "requests"
INNER JOIN "jobs" "job" ON "job"."id" = "requests"."job_id"
INNER JOIN "quotes" ON "quotes"."job_id" = "job"."id"
WHERE "quote"."attachment_updated_at" IS NULL"

正在尝试使用此查询的预期对象结果:

Request.joins(job: :quote).where(job: {quote: {attachment_updated_at: nil}}).pluck(:id)

给了我:

ERROR:  missing FROM-clause entry for table "quote"

这是预期的,因为quote没有在select语句中声明。**为什么where子句改变了join语句?**查看两个查询中JOIN "jobs" "job"之间的差异。

修复

一个简单的解决方法是在where子句中将quote重命名为quotes。但这看起来真的很古怪(我不是在找引号,我在找一个单引号),而且几乎就像我只是把整个嵌套查询的事情都做错了。在where子句中,所有关联引用都应该是复数吗?

t5zmwmid

t5zmwmid1#

Rails对where使用数据库表名,对joinsincludeseager_load使用关联名。

Request.joins(job: :quote).where(jobs: {quotes: {attachment_updated_at: nil}}).pluck(:id)

另一个提示:不要忘记添加distinct,以避免 * 重复 * 请求。

Request.joins(job: :quote).where(jobs: {quotes: {attachment_updated_at: nil}}).distinct.pluck(:id)

相关问题