2008-10-03 7 views
20

J'essaie de créer un named_scope qui utilise une jointure, mais bien que le SQL généré semble correct, le résultat est garbage. Par exemple:Rails named_scopes avec des jointures

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

(un clip est la propriété d'une série, une série appartient à un spectacle, un spectacle peut être visible ou invisible).

Clip.all fait:

SELECT * FROM `clips` 

Clip.visible.all fait:

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

Cela semble correct. Mais le tableau de modèles Clip qui en résulte inclut un Clip avec un ID qui n'est pas dans la base de données - il a plutôt choisi un ID de spectacle. Où vais-je mal?

Répondre

26

Le problème est que "SELECT *" - la requête reprend toutes les colonnes de clips, des séries et des émissions, dans cet ordre. Chaque table a une colonne id et entraîne des conflits entre les colonnes nommées dans les résultats. La dernière colonne d'id retirée (des shows) remplace celle que vous voulez. Vous devriez utiliser une option: select avec les: jointures, comme:

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