質問

結合を使用する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' "
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top