我的设置有出版物、草稿和实时版本。出版物具有多态性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
因为只有一个出版物的 apublishable_id
为 2,所以我希望此查询返回第二个 Foo。但是当我在 Foo 上调用发布的范围时,我得到的是第一个。这怎么可能?我认为 INNER JOIN 会将结果限制在满足连接条件的地方?我如何得到与我正在寻找的完全相反的东西?
有趣的事情:只执行连接返回正确的结果:
self.class.unscoped.joins(:publications)
但是,发布的范围(如上所示)返回不正确的结果。导致这种情况的查询的 SELECT 或 GROUP BY 部分是否发生了什么?