2008-10-03 5 views
20

Ich versuche, ein named_scope zu erstellen, das einen Join verwendet, aber obwohl das generierte SQL richtig aussieht, ist das Ergebnis Müll. Zum Beispiel:Rails named_scopes mit Joins

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' " 
    } 

(A Clip von einer Serie gehört, eine Serie zu einer Show gehört, kann eine Karte sichtbar oder unsichtbar sein).

Clip.all tut:

SELECT * FROM `clips` 

Clip.visible.all tut:

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') 

Dies sieht okay. Aber das resultierende Array von Clip-Modellen enthält einen Clip mit einer ID, die nicht in der Datenbank enthalten ist - stattdessen wird eine Show-ID aufgenommen. Wo gehe ich falsch?

Antwort

26

Das Problem ist, dass "SELECT *" - die Abfrage wählt alle Spalten aus den Clips nach oben, Serien und Shows, in dieser Reihenfolge. Jede Tabelle hat eine ID-Spalte und führt zu Konflikten zwischen den benannten Spalten in den Ergebnissen. Die letzte ID-Spalte, die zurück gezogen wird (aus den Shows), überschreibt die gewünschte Spalte. Sie sollten eine: select-Option mit dem folgenden Befehl verwenden: joins, z. B .:

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' " 
}