Duda conceptual... modelo o librer ía?


#1

Holas, tengo una duda filosófica en un proyecto-experimento-juguete,
Boris la araña [1]

Es una aplicación Rails que almacena páginas y sus keywords asociadas.
Periódicamente visita las páginas en busca de enlaces que le descubran
nuevas páginas, y va almacenando su título, descripción y keywords de
las etiquetas meta.

Básicamente, los modelos que manejo son Pagina (una URL) y Keyword
(palabra clave, una página has_many keywords, etc.).

Para actualizar todo esto, tengo una tarea programada en el cron que
cada minuto llama a un controlador/vista desde donde cojo la siguiente
página en cola, le saco sus datos y marco como visitada, y así hasta
el siguiente minuto.

Ahora quiero hacer esto con script/runner y veo que sería más limpio
que la araña no fuera un controlador sino un modelo. Entre otras cosas
porque creo que script/runner espera un modelo, según se explica en
[2]. Así que me crearé mi modelo Spider, con métodos para pedirle que
haga sus cosas de arañas. :slight_smile:

Mi duda es… ¿dónde creo este modelo Spider? No se si meterlo en
app/models ya que no hay una tabla que almacene Spiders… y según la
definición del libro Agile… “the model is responsible for
maintaining the state of the application”. Entiendo que el estado se
mantiene en las tablas asociadas a los modelos…

Como es más bien un modelo auxiliar, ¿sería mejor definirlo en lib?

[1] http://boris.railes.net
[2]
http://wiki.rubyonrails.org/rails/pages/HowToRunBackgroundJobsInRails/


#2

Que casualidad, estoy haciendo algo parecido
en mi caso he creado un script, que va en la lib y que a su vez tiene

Sync::Models
Sync::Controllers

El view no es necesario, xq no muestra nada solo procesa
Si te fijas en como lo hace Camping parece muy lógico

Definitivamente yo lo metería en lib como un nuevo módulo dividido en
submodelos con sus clases respectivas

Hala,
marze

El 29/05/2007, a las 18:30, Jaime I.
escribió:

Holas, tengo una duda filosófica en un proyecto-experimento-juguete,


#3

On Tuesday 29 May 2007 17:30:10 Jaime I. wrote:

Mi duda es… ¿dónde creo este modelo Spider? No se si meterlo en
app/models ya que no hay una tabla que almacene Spiders… y según la
definición del libro Agile… “the model is responsible for
maintaining the state of the application”. Entiendo que el estado se
mantiene en las tablas asociadas a los modelos…

No todos los modelos de Rails tienen por qué ser persistentes. Es decir,
no
todos tienen que heredar de ActiveRecord::Base y tener una tabla
asociada.

Como es más bien un modelo auxiliar, ¿sería mejor definirlo en lib?

No estoy del todo de acuerdo: si tiene que ver con la lógica de negocio
directamente, yo lo pondría en app/models. Otra cosa es que, a lo mejor,
el
código referente a las operaciones de red (por poner un ejemplo), lo pongas
en lib/. No sé si me explico.

Saludos.


Imobach González Sosa
correo-e: imobachgs en banot punto net
jabber id: osoh en jabberes punto org
web: http://www.banot.net/~osoh/
blog: http://devnull.blogs.banot.net/


#4

On Thursday 31 May 2007 09:13:36 Imobach González Sosa wrote:

Como es más bien un modelo auxiliar, ¿sería mejor definirlo en lib?

No estoy del todo de acuerdo: si tiene que ver con la lógica de negocio
directamente, yo lo pondría en app/models. Otra cosa es que, a lo mejor, el
código referente a las operaciones de red (por poner un ejemplo), lo pongas
en lib/. No sé si me explico.

Saludos.

Bueno, pensándolo bien, en tu caso podrías tener a lo mejor un método de clase
Pagina#update_all que se encargase de hacer esas operaciones
(eventualmente
apoyándose en alguna biblioteca, que podrías poner en lib/). En “The Rails
Way”[1] hay un artículo[2] interesante al respecto.

Saludos.

[1] http://www.therailsway.com/
[2] http://www.therailsway.com/2006/12/18/importing-files


Imobach González Sosa
correo-e: imobachgs en banot punto net
jabber id: osoh en jabberes punto org
web: http://www.banot.net/~osoh/
blog: http://devnull.blogs.banot.net/


#5

El día 31/05/07, Imobach González Sosa removed_email_address@domain.invalid escribió:

Bueno, pensándolo bien, en tu caso podrías tener a lo mejor un método de
clase
Pagina#update_all que se encargase de hacer esas operaciones
(eventualmente
apoyándose en alguna biblioteca, que podrías poner en lib/).

Gracias Imobach, me has aclarado las dudas que tenía. Suena bien lo del
método de clase en el propio modelo Pagina, ¿quién mejor que esa clase
para
saber cuál es la siguiente página en cola de actualización? Me estaba
confundiendo al pensar que necesitaba un modelo aparte para la araña,
cuando
en realidad la araña es la aplicación en conjunto…

Aparte, tengo una librería precisamente como dices tú, para las
operaciones
de red, con la que extraigo las keywords de las urls y tal.