2008-10-03 9 views
20

Estoy tratando de crear un named_scope que utiliza una combinación, pero aunque el SQL generado se ve bien, el resultado son basura. Por ejemplo:rieles named_scopes con une

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 es propiedad de una serie, una serie pertenece a un espectáculo, un espectáculo puede ser visible o invisible).

Clip.all hace:

SELECT * FROM `clips` 

Clip.visible.all hace:

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

Esto se ve bien. Pero la matriz resultante de modelos de Clip incluye un Clip con una ID que no está en la base de datos; en su lugar, recogió una identificación de show. ¿Dónde estoy equivocado?

Respuesta

26

El problema es que "SELECT *" - la consulta recoge todas las columnas de los clips, series y programas, en ese orden. Cada tabla tiene una columna de id. Y genera conflictos entre las columnas nombradas en los resultados. La última columna de identificación retirada (de las presentaciones) reemplaza a la que desea. Usted debe utilizar un: seleccione la opción con el: une, como:

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