Rails JOIN返回看似正确的SQL,但返回错误的结果

时间:2013-04-26 07:07:52

标签: sql ruby-on-rails activerecord join inner-join

我的设置包括出版物,草稿和实时版本。出版物具有多态belongs_to,因为可以起草许多不同类型的对象。

# Publication.all
Publication id: 1, publishable_id: 2, publishable_type: "Foo", 
            original_id: 1, original_type: "Foo"

# published scope on Foo
select('*, MAX(publications.created_at)').
  joins(:publications).
  group('publications.original_id')

# Foo.published.all
[<Foo id: 1, ...>]

以下是已发布的范围to_sql

SELECT *, MAX(publications.created_at)
FROM "foos" 
INNER JOIN "publications" 
ON "publications"."publishable_id" = "foos"."id" 
AND "publications"."publishable_type" = 'Foo' 
GROUP BY publications.original_id

因为只有一个publishable_id为2的发布,所以我希望这个查询返回第二个Foo。但是当我在Foo上调用已发布的范围时,我会得到第一个。这怎么可能?我认为INNER JOIN会将结果限制在满足连接条件的位置?我如何得到与我正在寻找的完全相反的东西?

有趣的是:只是执行连接会返回正确的结果:

self.class.unscoped.joins(:publications)

但是,已发布的范围(如上所示)会返回不正确的结果。使用查询的SELECT或GROUP BY部分是否会发生这种情况?

0 个答案:

没有答案