让我们有两个ActiveRecord模型Product
和Promotion
使用外连接构建查询和连接表列的别名会产生以下无效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" does not exist
。正如所料,因为 features 是 promotions.advertised 列的别名,未在表产品中定义。
如您所见,ActiveRecord将无效的"featured AS alias_0"
表达式注入select。此外,products
表的所有列({1}}除外)都被省略。
以上不当行为与同时使用id
和order
方法有关。当省略其中任何一个时,生成的SQL变得正确。例如,只需单击删除 limit 即可生成正确的查询:
limit
有人可以解释这种行为吗?
错误报告的候选人或我错过了什么?
使用ActiveRecord ver测试。 4.2.7.1