Sql ActiveRecord';s查询外部联接的错误行为?

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_

让我们有两个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_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
方法,默默地返回了明显错误的结果。