Sql ActiveRecord';s查询外部联接的错误行为?
让我们有两个ActiveRecord型号Sql ActiveRecord';s查询外部联接的错误行为?,sql,ruby-on-rails,ruby,activerecord,Sql,Ruby On Rails,Ruby,Activerecord,让我们有两个ActiveRecord型号产品和促销 使用外部联接和别名为联接表列生成查询会生成以下无效SQL: Product.distinct.includes(:promotion).select('promotions.advertised as featured'). references(:promotion).order('featured').limit(10).to_sql SELECT DISTINCT "products"."id", featured AS alias_
产品
和促销
使用外部联接和别名为联接表列生成查询会生成以下无效SQL:
Product.distinct.includes(:promotion).select('promotions.advertised as featured').
references(:promotion).order('featured').limit(10).to_sql
SELECT DISTINCT "products"."id", featured AS alias_0 FROM "products"
^^^^^^^^^^^^^^^^^^^
LEFT OUTER JOIN "promotions" ON "promotions"."product_id" = "products"."id" ORDER BY featured LIMIT 10
执行结果导致数据库错误:ActiveRecord::StatementInvalid:PG::UndefinedColumn:error:column“featured”不存在
。正如所料,因为featured是promotions.Adverted列的别名,未在表products中定义
如您所见,ActiveRecord将无效的“作为别名0”
表达式注入select。此外,products
表中除id
之外的所有列都被省略
上述不当行为与同时使用顺序
和限制
方法有关。如果省略其中任何一个,则生成的SQL将变得正确。例如,仅删除一次限制即可生成正确的查询:
Product.distinct.includes(:promotion).select('promotions.advertised as featured').
references(:promotion).order('featured').to_sql
SELECT DISTINCT promotions.advertised as featured, "products"."id" AS t0_r0, "products"."name" AS t0_r1, … FROM "products"
LEFT OUTER JOIN "promotions" ON "promotions"."product_id" = "products"."id" ORDER BY featured
有人能解释这种行为吗
一份错误报告的候选人还是我遗漏了什么
使用ActiveRecord版本进行测试。4.2.7.1
不同
不是问题。忽略时对修复无效查询没有影响。我尝试过简化更复杂的问题,但基本思想没有改变。我不太明白你所说的“战斗”是什么意思,为什么它们不应该一起使用。我所说的“战斗”是指不同的,包括,和select
都试图对select子句做一些事情,看起来他们最终把它搞砸了。我仍然看不出这些方法有任何歧义或使用不当。让我恼火的是,可能还有其他人,它只是通过添加完全不相关的limit
方法,无声地返回明显错误的结果。distinct
不是问题。忽略时对修复无效查询没有影响。我尝试过简化更复杂的问题,但基本思想没有改变。我不太明白你所说的“战斗”是什么意思,为什么它们不应该一起使用。我所说的“战斗”是指不同的,包括,和select
都试图对select子句做一些事情,看起来他们最终把它搞砸了。我仍然看不出这些方法有任何歧义或使用不当。让我恼火的是,可能还有其他人,它只是通过添加完全不相关的limit
方法,默默地返回了明显错误的结果。