Contador de vistas en páginas


#1

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.

  1. 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!


#2

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 T.


#3

2009/1/16 Luis V. removed_email_address@domain.invalid:

Pero como! :slight_smile:

  1. 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.


#4

El 16/01/2009, a las 12:26, Luis V. 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.

  1. 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
removed_email_address@domain.invalid
http://cientifico.net


#5

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 :slight_smile:


#6

2009/1/16 Luis V. removed_email_address@domain.invalid

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!