unidos robert productores mejores hollywood historia famosos estadounidense estados directores director cine actuales ruby-on-rails optimization activerecord eager-loading

ruby-on-rails - robert - mejores directores de la historia



¿Cómo haces ansiosa cargando con límites? (3)

En la documentación de carga ansiosa se afirma que:

Si está ansioso de cargar una asociación con una opción especificada: limit, se ignorará y devolverá todos los objetos asociados:

class Picture < ActiveRecord::Base has_many :most_recent_comments, :class_name => ''Comment'', :order => ''id DESC'', :limit => 10 end

Picture.find (: first,: include =>: most_recent_comments) .most_recent_comments # => devuelve todos los comentarios asociados.

Si este es el caso, entonces, ¿cuál es la mejor manera de alcanzar el "límite" en la carga?

Digamos que estamos ansiosos por cargar las últimas 10 publicaciones de blog en la página principal de un blog, claramente no las queremos todas, ¿así que debería especificarse el límite y el orden de la colección de publicaciones?

Además de eso, ¿se pueden especificar las mismas condiciones en los elementos que están cargados en profundidad, por ejemplo, solo se muestran los primeros tres comentarios en cada publicación del blog?

Blog.find(:blog_id, :include => {:posts => :comments } )


Puede usar esta construcción: Picture.find(:first, :include => :most_recent_comments).most_recent_comments.limit(10)

Ver más en la guía AR


Creo que esto se debe a que el comando LIMIT en sql no se traduce bien en lo que estás tratando de hacer. LIMIT limitará las filas totales devueltas por la consulta. No estás tratando de hacer eso sin embargo. Está intentando limitar el número de filas unidas por cada imagen devuelta. Para lograr este efecto, tendría que usar SQL complejo, que podría ser difícil de optimizar si sus tablas son grandes. En ese punto consideraría por qué estás tratando de limitar las filas ansiosas cargadas.

Si la cantidad máxima de comentarios cargados ansiosos es manejable (<2000 o menos), probablemente no debería preocuparse por la limitación en el extremo SQL.

Sin embargo, si solo cargas 10 publicaciones, consideraría que no estoy ansioso por cargar nada. No esperaría que 10 consultas adicionales ralentizaran mucho las cosas, y a qué hora añadieron, podría compensar con otras técnicas de optimización como el almacenamiento en caché.

Debe dejar que los ámbitos hagan el trabajo sucio por usted, no por la asociación. Esto promueve la reutilización, el mantenimiento, la legibilidad. Ejemplo:

Class Picture < ActiveRecord::Base has_many :comments, :order => ''id DESC'' do def recent limit(10) end end end

De esta manera, .comments está ahí cuando lo necesitas, y también puedes .comments así:

@picture.comments.recent


He utilizado will_paginate para ayudarme junto con la carga ansiosa ( using includes ) ya que tengo que cargar muchos modelos asociados en una sola toma sin usar el limit

Image.includes(:user,:tags).where("user_id !=?",current_user.id).paginate(:page => params[:page], :per_page => 15)

O (sin will_paginate ( usando el limit )

Image.includes(:user,:tags).where("user_id !=?",current_user.id).limit(30).order("created_at ASC")

... pruébalo ... espero que ayude.