En algunas ocasiones, en nuestras aplicaciones Rails, necesitamos guardar una cantidad más o menos grande de datos en la base de datos. Si creamos todos los objetos a guardar y después los guardamos uno a uno, dependiendo de la cantidad de objetos, tardaremos una cantidad de tiempo más o menos considerable. Esto es debido a que nuestra aplicación ejecutará una consulta de inserción para cada objeto que queramos crear, lo que no es nada eficiente.

Como solución a este problema, podemos utilizar la gem activerecord-import. Esta gem añadirá un método de clase import a nuestos modelos ActiveRecord, mediante el cual podremos guardar una cantidad grande de datos de una forma mucho más rápida.

Este método toma como argumentos dos arrays, uno con los nombres de los campos a rellenar, y otro con los datos a insertar. Este segundo array a su vez está formado por arrays, que contienen los valores para cada uno de los registros que deseemos insertar. Pongo un ejemplo para que quede un poco más claro.

def save_user_books(user,books)
  fields = [:user_id, :book_id]
  data = Array.new

  books.each do |book_id|
    item = Array.new
    item << user.id
    item << book_id
    data << item
  end

  UserBooks.import fields, data
end

 

Tenemos el método save_user_books cuyo fin es guardar una lista de registros en la tabla user_books. El método recibe un objeto user - user - y una lista de libros - books -. La tabla a tiene los campos user_id y book_id. Introducimos los nombres de los campos en un array - fields -. A continuación creamos un array con los registros a introducir - data -. Cada elemento de este array es a su vez un array - item -, en el que introduciremos los valores para los campos user_id y book_id.

Una vez creados los arrays fields y data llamamos al método import con estos arrays como parámetros.

Este método inserta todos los datos en la base de datos ejecutando una única consulta, lo que reduce considerablemente el tiempo de ejecución del método.

Aunque esta no sea una necesidad muy habitual, de esta manera podremos realizar las inserciones en la base de datos de una forma mucho más eficiente.

 
 

Publicado por Rubén el 05/08/2012 a las 20:11



Publicar comentario: