Para empezar, te conviene abstraer el proceso en algun objeto de manera que en
tu controller no tengas tanto codigo. Algo como:
class ProcesosController < ApplicationController
def create
@proceso = ProcesoCompleto.new(params[:proceso])
end
end
Un pequeño tip: No hace falta que definas tu estructura cada vez. Saca la
definicion del struct fuera de la clase:
Struct.new "Estructura", :buque, :matricula, :fecha, :latitud,
:longitud,:rumbo, :vel, :emp, :tipo, :inm, :dnid, :mem,:mmsi, :mdn
Struct::Estructura.new (quizas quieras darle un nombre menos generico)
Para correr algo en "background" necesitas algo como backgrounddrb. El tema es
que si estas en windows por ahora no te va a funcionar (me conto un pajarito
que quizas dentro de poco haya soporte de backgroundrb para windows ;)
Por lo pronto te recomiendo hacer un task y correrlo desde el root de tu
aplicacion.
rake mis_procesos:mi_tarea Parametro1=LALALA Parametro2=123 Etc...
Si te interesa este approach, incluso lo podes programar con el task scehduler
de windows o algun otro programa. Las tasks son simples script de rake que se
tiran en el directorio lib/task/tarea.rake. Ejemplo:
lib/tasks/USERS.rake
namespace :users do
desc "Crear usuario admin, contraseña admin"
task(:admin => :environment) do # << linea fundamental, levanta el ambiente
rails
#Aca podes abrir un archivo o hacer lo-que-se-te-cante
# Yo solo creo el administrator de mi tabla user, por darte un ejemplo.
User.create :login => 'admin',
:password => 'admin',
:password_confirmation => 'admin',
:email => '[EMAIL PROTECTED]',
:is_admin => true
end
end
Ahora, desde el root de la app, hago rake users:admin y se ejecuta el codigo en
cuestion.
Fernando Castañeda <[EMAIL PROTECTED]> escribió: Gracias Emmanuel intuia
que venia por ahi pero no sabia como implementarlo o pensaba que ya estaba
realizado.
En cuanto a procesar un archivo de texto por una action de un controller lo
arme asi ya que se realizan tres procesos diarios solamente de estos archivos
de texto
dentro de una intranet. Cada archiv de texto tiene entre 1000-2000 que
representan movimientos de buques que marcan su posicion cada 4 hs, mas o
menos.
Como se podria realizar esta tarea en un background sin que el usuario tenga
que esperar el request de que se grabo todo exitosamente ?
Como controlaria el proceso si no se realiza de esa manera ?
Gracias nuevamente por tu colaboracion!
----- Original Message -----
From: Emmanuel Oga
To: Grupo Ruby Argentina
Sent: Wednesday, October 17, 2007 9:19 AM
Subject: Re: [RubyArg] Struct como parametro en el initialize de un objeto
Lo que necesitas es el metodo "to_hash" en tu struct. Por desgracia, Struct
no trae tal metodo. Sin embargo, es bastante facil de agregar:
Struct.new "Hola", :a, :b
a= Struct::Hola.new 1, 2
class Struct::Hola
def to_hash
members.inject({}) do |hsh, member|
hsh[member]= self.send(member); hsh
end
end
end
a # => #<struct Struct::Hola a=1, b=2>
a.to_hash # => {"a"=>1, "b"=>2}
Ahora podes hacer:
DerivadoDeActiveRecord.new a.to_hash
P.D.: No te recomiendo procesar un archivo de texto en una action de un
controller.... te imaginas al usuario haciendo click y teniendo que esperar
10 segundos a que le devuelva el request? Ahora imaginate a 5 o 6 usurios al
mismo tiempo haciendo lo mismo....
Fernando Castañeda <[EMAIL PROTECTED]> escribió: Hola Lista :
Como se inicializa un objeto (ActiveRecord) con los elementos de un struct
que le pasa como parametro.
En la definicion de los elementos del struct son los mismos que los
atributos de la clase y tabla que mapea, pero se puede mapear cada
elemento
del
struct contra los atributos del objeto automaticamente, sin tener que
definir un initialize en la clase y mapear a mano cada atributo ?
Ej. de codigo :
(Es un tipo encabezado-detalle) (Proceso-Movimiento)
class ProcesosController < ApplicationController
def create
@proceso = Proceso.new(params[:proceso])
estructura = Struct.new(:buque, :matricula, :fecha, :latitud,
:longitud,:rumbo, :vel, :emp, :tipo, :inm, :dnid, :mem,:mmsi, :mdn )
registros = File.open(@proceso.filename).map {|linea| if linea.length >=
106
then estructura.new(linea[0..30].strip, *linea[31..-1].split) end}
registros.each{|x| self.armar_movimiento(x) }
end
end
def armar_movimiento(x)
# X tiene la sig. info => matricula="1200788",buque="San Marcos I",
"fecha="051213", latitud="4244.163S", longitud="06501.443W", rumbo="348",
vel="00.0", emp="0932", tipo="010", inm="G", dnid="470181355",
mem="00804",
mmsi="028", mdn="701000925", termid=nil>
movi=Movimiento.new(params[:x])
#aca quisiera que la estruct del struct se mapee automaticamente
#con la estructur del objeto ya que son componetens se llaman iguales
@proceso.movimientos << movi
end
Muchas gracias y espero que se haya entendido
Fernando Castañeda
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
---------------------------------
Yahoo! Noticias
Leé la columna de "El Chavo" Fucks y encontrá una visión distinta de las
Elecciones Presidenciales 2007.
http://ar.news.yahoo.com/elecciones2007/opinion/1979/pinginos-empetrolados
---------------------------------
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
_______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
---------------------------------
Yahoo! Noticias
Leé la columna de "El Chavo" Fucks y encontrá una visión distinta de las
Elecciones Presidenciales 2007.
http://ar.news.yahoo.com/elecciones2007/opinion/1979/pinginos-empetrolados _______________________________________________
Ruby mailing list
[email protected]
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar