2012-07-24 11 views
5

que tienen una relación padre/hijo en mi solicitudRails Active Record seleccione padre e hijo como un resultado

class Polling 
has_many :alerts, :dependent => :destroy 

class Alert 
belongs_to :polling 

En mi página de índice para las alertas, que necesitan mostrar algunos datos de cada padre, y esto los resultados en dos consultas

Alert Load (6.1ms) SELECT * FROM (SELECT * FROM "ALERTS" INNER JOIN "POLLINGS" ON "POLLINGS"."ID" = "ALERTS"."POLLING_ID" ORDER BY "ALERTS"."ID" DESC) WHERE ROWNUM <= 1 
Polling Load (1.8ms) SELECT "POLLINGS".* FROM "POLLINGS" WHERE "POLLINGS"."ID" = 10113 AND ROWNUM <= 1 

Obviamente, esto hace que el tiempo de carga de las páginas bastante horrible ya que tiene que recorrer cada uno y tire del objeto padre también.

he intentado un par de cosas, tales como

> Alert.joins(:polling).where(...) 
> Alert.includes(:polling).where(...) 
> Alert.joins(:polling).select('*').where(...) 

Y cada vez que tengo dos preguntas distintas cuando visite mi página de índice. Uno para cada Alerta, y luego otro para obtener sus datos principales. ¿Cómo puedo hacer esto en una línea para que cuando retire las alertas también obtenga sus datos principales asociados? No parece haber una manera de hacerlo desde el otro lado porque si hago un Pollings.where(...) no atrapa a los niños como un grupo.

+1

Definitivamente está en el camino correcto con el método includes. El otro ángulo sería probar Polling.includes (: alerts) .where (...). ¿Puedes publicar tu código de vista? – steakchaser

+0

El problema es que tenemos que ir desde el lado del niño, no del lado de los padres. – Oranges13

+0

¿No quieres precargar? http://apidock.com/rails/ActiveRecord/AssociationPreload/ClassMethods/preload_associations – toxaq

Respuesta

2

Si desea especificar SQL en detalle, siempre se puede intentar find método fallecimiento: incluir,: une,: donde etc. includes o joins hace lo mismo en la línea cuando se intenta acceder a los datos, pero el comportamiento de activerecord es diferente. Por ejemplo, siguiendo 3 formas de configurar la matriz de objetos, pero son diferentes.

[1]

alerts = Alert.joins(:polling) 

[2]

alerts = Alert.includes(:polling) 

[3]

alerts = Alert.find(:all, :includes => :polling, :joins => :polling) 

cuando haces

alerts.each do |alert| 
    alert.pollings.each do |polling| 
    p polling 
    end 
end 

puede ver cómo activerecord intenta obtener datos de DB o caché. La forma [3], creo, arroja una sola consulta cuando otros lanzan múltiples consultas.

+0

He encontrado que incluso si hago Alert.find con un join, si uso alert.pollings, todavía los retira por separado de la base de datos , así que eso es lo que causaba que todavía hiciera las consultas adicionales. Terminé usando un .select() también y simplemente haciendo alert.polling_field funciona según lo previsto. Raro, pero funciona. – Oranges13

Cuestiones relacionadas