Frage

Ich versuche, eine named_scope zu schaffen, die eine Verknüpfung verwendet, aber obwohl die generierten SQL-Recht sieht, ist das Ergebnis Müll. Zum Beispiel:

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

Das sieht in Ordnung. Aber die resultierende Anordnung von Clip-Modellen enthält einen Clip mit einer ID, die nicht in der Datenbank - es ist stattdessen eine Show ID abgeholt. Wo soll ich denn falsch?

War es hilfreich?

Lösung

Das Problem ist, dass „SELECT *“ - die Abfrage nimmt alle Spalten aus den Clips, Serien und Shows, in dieser Reihenfolge. Jede Tabelle hat eine ID-Spalte, und das Ergebnis in Konflikten zwischen den benannten Spalten in den Ergebnissen. Die letzte Spalte id zog sich zurück (von Shows) überschreibt die gewünschte aus. wählen Sie die Option mit der: beitritt, wie: Sie sollten ein verwenden

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' "
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top