Pregunta

Estoy tratando de crear un named_scope que usa una unión, pero aunque el SQL generado se ve bien, el resultado es basura. Por ejemplo:

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 Show, un Show 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, se tomó una ID de programa. ¿A dónde me voy mal?

¿Fue útil?

Solución

El problema es que " SELECT * " - la consulta recoge todas las columnas de clips, series y espectáculos, en ese orden. Cada tabla tiene una columna de identificación y genera conflictos entre las columnas nombradas en los resultados. La última columna de identificación retirada (de los programas) anula la que desea. Debería usar una opción: select con: uniones, 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' "
}

Otros consejos

Esto es un error:

http: //rails.lighthouseapp.com/projects/8994/tickets/1077-chaining-scopes-with-duplicate- une-causa-problema-alias

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top