我正在将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子句中,所有关联引用都应该是复数吗?
1条答案
按热度按时间t5zmwmid1#
Rails对where使用数据库表名,对joins、includes和eager_load使用关联名。
另一个提示:不要忘记添加distinct,以避免 * 重复 * 请求。