¿El rubí en los carriles “has_many” matriz proporcionar datos en una “necesidad de saber”?

StackOverflow https://stackoverflow.com/questions/2891940

Pregunta

En Ruby on Rails, por ejemplo, si el objeto del Actor es Tom Hanks, y los aficionados "has_many" es de 20.000 objetos del ventilador, entonces

actor.fans

da una matriz con 20.000 elementos. Probablemente, los elementos no están pre-rellenan con valores? De lo contrario, cada objeto de conseguir Actor de la BD puede llevar mucho tiempo.

Por lo tanto, se encuentra en una "necesidad de saber"?

Así que no se tire de los datos cuando accedo a actor.fans [500], y los datos de extracción cuando accedo a actor.fans [0]? Si se salta de cada registro a registro, entonces no será capaz de optimizar el rendimiento al hacer lectura secuencial, lo que puede ser más rápido en el disco duro porque esos registros podrían estar en la capa de sector / plato de cerca - por ejemplo, si el programa toca 2 elementos aleatorios, entonces será más rápido sólo para leer esos 2 registros, pero lo que si toca todos los elementos en orden aleatorio, entonces puede ser más rápido sólo para leer todos los registros de una manera secuencial, y luego procesar el azar elementos. Pero, ¿cómo va a RoR saber si estoy haciendo sólo unos pocos elementos aleatorios o todos los elementos de azar?

¿Fue útil?

Solución

¿Por qué quieres a buscar 50000 registros si sólo utiliza 2 de ellos? A continuación, ir a buscar sólo los dos de DB. Si desea una lista de los ventiladores, entonces es probable que utilice la paginación -. Es decir, limitar el uso y el desplazamiento de la consulta, o alguna joya como la paginación will_paginate

No veo ninguna explicación lógica por qué debería seguir el camino intenta. Explicar una situación real, de modo que podríamos ayudarle.

Sin embargo, hay uno piensa que necesita saber carga Wile muchos objetos asociados de DB - utilización: incluyen como

Actor.all(:include => :fans)

Esto ansiosos de carga todos los ventiladores por lo que no sólo serán 2 consultas en lugar de N + 1, donde N es una cantidad de actores

Otros consejos

Mira el SQL que se arrojó a cabo por el servidor en el modo de desarrollo, y que le dirá cómo se cargan muchos registros de los ventiladores. En este caso actor.fans de hecho hará que todos ellos sean cargados, lo que probablemente no es lo que desea.

Existen varias opciones:

  • Utilice un paginador como sugiere tadas;
  • crear otra asociación con la tabla fans que tira en sólo los que está interesado. Esto se puede hacer ya sea con unas condiciones de la cuenta de has_many, por ejemplo
    has_many :fans, :conditions => "country of residence = 'UK'"
  • Especificación del SQL completa de restringir las filas devueltas con la opción :finder_sql
  • Especificación de la opción :limit que será, así, limitar, el número de filas devuelto.

Todo depende de lo que quiere hacer.

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