Friday, February 01, 2013

Rails: Eager Loading


Una forma de mejorar el rendimiento en una aplicación es reducir el número de consultas SQL. Puedes hacer esto mediante una "precarga" o eager loading.

Imaginemos que tenemos el siguiente modelo:



class User < ActiveRecord::Base
  
   has_many :articles 
 
end


class Article < ActiveRecord::Base
  
   belongs_to :user
 
end

Si quisieramos pintar todos los articulos publicados en un periódico con la información del usuario que lo escribió, tendríamos algo similar a esto:
@articles = Article.find(:all)

@articles.each do |a|
  %p = a.title
  %p = a.user.name
end
El problema de esto es que si tenemos n articles estaríamos haciendo n accesos a base de datos para recuperar el user que lo escribió.
 

Para evitar esto se puede usar precisamente el eager loading, es decir hacer una precarga de esos users, para luego no tener que acceder a base de datos. La solución sería la siguiente:

@articles = Article.find(:all, :include => :users)

 Esto haría que además de acceder a la tabla articles hiciese una query de la forma:

User Load (0.1ms)  SELECT `users`.* FROM `users` WHERE (`users`.article_id IN (1,2,3,4,5,6,7,8,9,10,50,102,103,28,101,16,25,22,78,80,84,86,88,89,99,105,107))


No comments:

Post a Comment