Forum: Rails-ES Contador de vistas en páginas

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
0a183e056da6358e2e9e9d60b77e225e?d=identicon&s=25 Luis Villa (maguisso)
on 2009-01-16 12:26
Hola a todos,

Estoy construyendo una modesta aplicación en la que se podrán ver
charlas incrustadas en video a partir de ponentes. Los usuarios podrán
darse de alta, publicar ponentes, publicar charlas y asignarlas a
ponentes, comentar, hacer contactos, guardar favoritos...

Una de las necesidades que tengo es incluir las veces que una charla ha
sido vista para filtrarlas más adelante.

Mi duda es de enfoque (mi nivel en Rails es de iniciación):

¿Cómo puedo hacer un contador para conocer cuantas veces se ha visto
cada video? Tengo estas opciones en mente...

1a. Crear un modelo "Pageview" asociado a "Talk" y meter cada pagina
vista en "Pageview" como un registro que almacene visita, fecha y
usuario si está logado, por ejemplo -en este caso, no sé si guardar cada
visita individualmente podría afectar mucho a partir de cierto nivel de
tráfico-.

1b. Crear un modelo "Pageview" y asignarle un contador para cada charla
e ir subiéndolo en cada petición.

2. Crear un campo "contador" dentro del propio modelo "Talk" y subirlo
con un +1 para cada vista de la página.

3, Me han comentado, incluso apoyarme en modelo + otra base de datos
para no bloquear peticiones. Creo que esta opción, puede ser más de lo
que necesito para arrancar.


En principio, descarto limitar vistas por visitante y sesión. ¿Creeis
que alguna opción es mas recomendable que otra?


Gracias por adelantado!
A3217d68e477bf008a2eed6991ba86f8?d=identicon&s=25 Felipe Talavera Armero (Guest)
on 2009-01-16 12:39
(Received via mailing list)
Holas,

Hace unos meses solucioné un problema parecido para guardarme
estadísticas de unos modelos. Finalmente saqué un plugin para poder
reutilizar la
implementación.
Si quieres pegarle un vistazo esta por github
http://github.com/flype/stats_for_all/tree

Si no te aclaras para ponerlo en marcha o encuentras algún bug,
coméntalo y lo miramos.

Un saludo
Felipe Talavera
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2009-01-16 12:39
(Received via mailing list)
2009/1/16 Luis Villa <ruby-forum-incoming@andreas-s.net>:

Pero como! :-)

> 2. Crear un campo "contador" dentro del propio modelo "Talk" y subirlo
> con un +1 para cada vista de la página.

Por lo general soy partidario de estas soluciones. A menos que este
previsto que sea necesaria la generalizacion yo aplico los axiomas you
ain't gonna need it, y keep it simple. Eso es lo que necesitas, y se
implementa en un momento.

Si esta previsto que tenga otros usos entonces el diseño deberia
acomodarlos a todos.
39086eb3d9a1437276d07c08ea0c3821?d=identicon&s=25 Guillermo Álvarez Fernández (Guest)
on 2009-01-16 12:53
(Received via mailing list)
El 16/01/2009, a las 12:26, Luis Villa escribió:
> 1a. Crear un modelo "Pageview" asociado a "Talk" y meter cada pagina
> vista en "Pageview" como un registro que almacene visita, fecha y
> usuario si está logado, por ejemplo -en este caso, no sé si guardar
> cada
> visita individualmente podría afectar mucho a partir de cierto nivel
> de
> tráfico-.

La diferencia que hay entre esta y las otra es abismal. Mientras que
con esta podrás mostar al usuario un historial de las páginas vistas
por usuario, con el resto no.


> 2. Crear un campo "contador" dentro del propio modelo "Talk" y subirlo
> con un +1 para cada vista de la página.
>
Comparto opinión con Xavier. Además ActiveRecord ya te da todo el
trabajo hecho.

class TalkController < ApController
   after_filter :update_views

   private
   def update_views
     Talk.increment_counter(:views,params[:id])
   end
end


Eso si, sería un insert por consulta.   Pero es la solución más sencilla

> 3, Me han comentado, incluso apoyarme en modelo + otra base de datos
> para no bloquear peticiones. Creo que esta opción, puede ser más de lo
> que necesito para arrancar.

Eso creo que se llama optimización prematura.

---
Guillermo Álvarez Fernández
guillermo@cientifico.net
http://cientifico.net
5c15703984caa012845b3cea129da936?d=identicon&s=25 Manuel González Noriega (Guest)
on 2009-01-16 13:02
(Received via mailing list)
2009/1/16 Luis Villa <ruby-forum-incoming@andreas-s.net>

> Mi duda es de enfoque (mi nivel en Rails es de iniciación):
>
> ¿Cómo puedo hacer un contador para conocer cuantas veces se ha visto
> cada video? Tengo estas opciones en mente...
>
> 1a. Crear un modelo "Pageview" asociado a "Talk" y meter cada pagina
> vista en "Pageview" como un registro que almacene visita, fecha y
> usuario si está logado, por ejemplo -en este caso, no sé si guardar cada
> visita individualmente podría afectar mucho a partir de cierto nivel de
> tráfico-.



Como comenta también Guillermo, esta solución es distinta a las otras
por
naturaleza. Basicamente comentas dos opciones:

1) Guardar un contador de visitas para cada charla. Optimizar por
rendimiento te daría contador en el modelo Talk, contador aparte, base
de
datos externa.
2) Guardar información mucho más rica para cada visita, IP
¿geolocalizada?,
fecha, etc. Con esta opción puedes mostrar gráficas de evolución,
correlacionar datos, etc.

Primero tienes que decidir por qué camino optas. En el caso del primero,
como te dicen, bastaría con empezar por el contador en Talk e ir
optimizando
según las necesidades de la aplicación, para no caer en optimización
prematura, YAGNI y demás. Pero puede que decidas que necesitas
información
más rica para, por ejemplo, mostrar índices de popularidad por tiempo o
cosas así. A partir de aquí deberías aplicar el mismo principio: Lo Más
Simple Que Pueda Funcionar, y evolucionar cuando ya no funcione.


Godspeed!
0a183e056da6358e2e9e9d60b77e225e?d=identicon&s=25 Luis Villa (maguisso)
on 2009-01-16 13:36
Gracias a todos!

Entiendo las consecuencias que planteais. La riqueza de datos es una
"batalla" que me puede costar perder la "guerra" del proyecto. Estoy
dispuesto a prescindir de ella a cambio de seguir avanzando.

De momento vamos a por lo 'quick wins' y haré como recomiendan Xavi y
Guillermo. No sin antes echarle un vistazo al plugin de Felipe.

Gracias de nuevo :)
This topic is locked and can not be replied to.