20

結合を使用する 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 が含まれます。代わりに、ショー ID が取得されます。どこが間違っていますか?

4

2 に答える 2

26

問題は、「SELECT *」 - クエリがクリップ、シリーズ、ショーからすべての列をこの順序で取得することです。各テーブルには id 列があり、結果の名前付き列の間で競合が発生します。(ショーから)引き戻された最後の id 列は、必要なものを上書きします。次のように、:select オプションを :joins とともに使用する必要があります。

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' "
}
于 2008-10-03T10:56:23.723 に答える
5

これはバグです:

http://rails.lighthouseapp.com/projects/8994/tickets/1077-chaining-scopes-with-duplicate-joins-causes-alias-problem

于 2008-10-03T10:32:51.960 に答える