私が持っているセットアップには、出版物、ドラフト、ライブ バージョンがあります。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
a が 2 の出版物は 1 つしかないためpublishable_id
、このクエリは 2 番目の Foo を返すと予想します。しかし、公開されたスコープを Foo で呼び出すと、代わりに最初のスコープが取得されます。これはどのように可能ですか?INNER JOIN は、結合条件が満たされる場所に結果を制限すると思いましたか? 探しているものとは正反対のものをどのように取得していますか?
興味深い点: 結合を実行するだけで、正しい結果が返されます。
self.class.unscoped.joins(:publications)
ただし、公開されたスコープ (上に表示) は正しくない結果を返します。これを引き起こしているクエリの SELECT または GROUP BY 部分で何かが起こっていますか?