Existe una gema muy útil que permite cargar de forma sencilla archivos CSV desde el panel de control de active admin, por regla general es muy fácil de utilizar, sólo tienes que crear un archivo CSV que en la cabecera tengan los campos que quieres guardar (tienen que coincidir con el modelo) y listo.

La gema se llama active_admin_import, para instalarla tenemos que agregar a nuestro gemfile

gem "active_admin_import" , '2.1.2'

y luego:

bundle

Entonces suponiendo que tenemos el modelo pedidos con id y nombre, tendríamos que crear el recurso pedido con activeadmin y agregar dentro de admin/pedido.rb y dentro del archivo tendríamos que poner:

active_admin_import

y luego crear un archivo .csv con la cabecera

id,producto
1,televisor
2,Ps4
3,Xbox1

el formato de CSV por defecto es sin espacios separadores entre la coma, o sea pone todo junto, eso no quiere decir que no puedas ocupar espacio, sólo que no debes agregarlo entre medio del símbolo coma.

Importando un csv de usuarios con devise.

En el caso de que quieras insertar usuarios que estén bajo devise es un poco más complejo, puesto que el password no es parte del modelo, lo que si tiene es un encrypted_password, entonces para poder guardar correctamente a los usuarios lo que vamos a hacer es modificar el CSV que está leyendo active_admin_import para cambiar los password por password encriptados, además tenemos que apagar las validaciones y sacamos el header para no confundir a active_admin con el cambio del nombre del campo de password a encrypted_password.

Aquí dejo un ejemplo de un usuario con devise que tiene email y password.


  active_admin_import validate: false,
    before_batch_import: proc { |import|
      import.csv_lines.count.times do |i|
        import.csv_lines[i][2] = User.new(password: import.csv_lines[i][2]).encrypted_password
      end
    },
    :template_object => ActiveAdminImport::Model.new(
        :hint => "file will be imported with such header format: 'email','name','password'",
        :csv_headers => ["name", "email", "encrypted_password", "cohort_id", "role"],
        csv_options: { col_sep: ","} 
    ),
    :timestamps=> true,
    :batch_size => 1000