1

私が持っているセットアップには、出版物、ドラフト、ライブ バージョンがあります。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 部分で何かが起こっていますか?

4

0 に答える 0