Rails named_scopes with joins
-
03-07-2019 - |
質問
結合を使用するnamed_scopeを作成しようとしていますが、生成されたSQLは正しく見えますが、結果はゴミです。例:
class Clip < ActiveRecord::Base
named_scope :visible, {
:joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id",
:conditions=>"shows.visible = 1 AND clips.owner_type = 'Series' "
}
(クリップはシリーズによって所有され、シリーズはショーに属します。ショーは表示または非表示にできます)。
Clip.allの機能:
SELECT * FROM `clips`
Clip.visible.allの機能:
SELECT * FROM `clips` INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id WHERE (shows.visible = 1 AND clips.owner_type = 'Series' )
これは問題ありません。ただし、結果として得られるClipモデルの配列には、データベースにないIDを持つClipが含まれます。代わりに、show IDが取得されます。どこがおかしいのですか?
解決
問題は、&quot; SELECT *&quot; -クエリは、クリップ、シリーズ、ショーからすべての列をこの順序で選択します。各テーブルにはid列があり、結果の名前付き列間で競合が発生します。 (ショーから)引き戻された最後のid列は、必要な列をオーバーライドします。次のような:joinsで:selectオプションを使用する必要があります:
named_scope :visible, {
:select => "episodes.*",
:joins => "INNER JOIN series ON series.id = clips.owner_id INNER JOIN shows on shows.id = series.show_id",
:conditions=>"shows.visible = 1 AND clips.owner_type = 'Series' "
}
所属していません StackOverflow