Jugar con el "tiempo real"

Veréis, en mi aplicación (parecida a un PCFútbol pero por internet), los
usuarios juegan partidos con sus equipos, he diseñado la forma de
gestionar y jugarlos de esta:

Se cierran las plantillas -> Se simulan los partidos -> Se hacen
visibles los reportes del partido -> Se pasa a la siguiente jornada ->
Se abren las plantillas.

Bien, mi idea era versátil, al ser todas las acciones accesibles vía web
si eres administrador podías hacer la gestión de las acciones desde
cualquier lugar, pero también me resultaba interesante la idea de
automatizar la tarea.

En un principio pensé en tener 6 scripts distintos que se ejecutarán en
distintas horas mediante cron (por ejemplo):

Cerrar plantillas -> 17 H.
Simular partidos -> 17.30 H.
Hacer visibles los reportes -> 19.00 H.
Siguiente jornada -> 24.00 H.
Abrir plantillas -> 00.30 H.

Bien, mi duda viene a la hora de hacer visibles los reportes, son líneas
de comentarios con las acciones que han sucedido en el partido y en el
minuto en que lo han hecho, un estilo a esto:

match_report(id, match_general_id, minute, action, player_id)

Pues bien, teniendo en cuenta que los partidos se hacen visibles a las
19.00 horas, a las 19.30 deberían de aparecer sólo los match_report que
van en el rango de las 19.00 y los 30 minutos después, ¿Cómo podría
hacer esto?

2009/5/13 Carlos Belizón [email protected]

hacer esto?

No me parece haberle entendido bien, pero si los match_reports tienen un
created_at o similar, y por “aparecer” quieres decir hacer un find y
mostrarlos ¿No te sirve restringir el find a los reports creados en la
franja adecuada?

Manuel González Noriega wrote:

2009/5/13 Carlos Belizón [email protected]

hacer esto?

No me parece haberle entendido bien, pero si los match_reports tienen un
created_at o similar, y por “aparecer” quieres decir hacer un find y
mostrarlos ¿No te sirve restringir el find a los reports creados en la
franja adecuada?

Los match_reports se crean todos muy rapido ya que los partidos cuando
se simulan ejecutan un algoritmo que se ejecuta rápidamente, lo que se
guarda es el minuto “imaginario” en el que ocurre la acción.

Es decir el partido cuando se va mostrar realmente está jugado
completamente pero se muestra “poco a poco” en tiempo real para dar
sensación de realismo. Algo parecido al AS cuando narra un partido por
internet pero teniendo en cuenta que el partido ya está narrado
completamente.

2009/5/13 Carlos Belizón [email protected]

Es decir el partido cuando se va mostrar realmente está jugado
completamente pero se muestra “poco a poco” en tiempo real para dar
sensación de realismo. Algo parecido al AS cuando narra un partido por
internet pero teniendo en cuenta que el partido ya está narrado
completamente.

¿Estamos hablando de la vista? Entonces puedes usar javascript:
precarga
todos los match reports del partido en js y a continuación vete
haciéndolos
visibles uno a uno cada n segundos. Con jQuery o cualquier librería es
bastante trivial.

Guillermo wrote:

2009/5/13 Carlos Belizón [email protected]

Es decir el partido cuando se va mostrar realmente está jugado
completamente pero se muestra “poco a poco” en tiempo real para dar
sensación de realismo.

Bueno, sigue pudiendo acceder a ellos.

Por un lado haces un name_scope para los que se jueguen.

named_scope :now_playing lambda { {:conditions => {:created_at =>
[(Time.now-1.minute)…(Time.now)] }}}

y luego añades un método.

def playing?
[(Time.now-1.minute)…(Time.now)].include? self.created_at
end

Y ya tienes esa franja viertual de un minuto.

Aunque igual he entendido mal lo que quieres.

Sí, por desgracia me has entendido mal, veamos vuelvo a explicar mi
idea.

Tengo las siguientes clases:

round(id, season_id, flag_simulated, date_start, number) (Jornadas)
match_general(id, round_id, local, guest) (Datos generales del partido)
match_report(match_general_id, player_id, club_id, action, player_id,
club_id) (Sucesos del partido)

Las relaciones van de esta forma:

class Round < ActiveRecord::Base
belongs_to :season
has_many :match_generals
end

class MatchGeneral < ActiveRecord::Base
belongs_to :round
has_many :match_reports
end

class MatchReport < ActiveRecord::Base
belongs_to :match_general
end

Cuando se ejecuta la accion SimulateRound de mi controlador Admin, se
crean los MatchReports para los partidos pertenecientes a la jornada
actual de mi Season y se pone a true el flag_simulated de Round.

Ahora es posible ejecutar la acción ShowMatchs de mi controlador Admin,
se pone el date_start a Time.now.

Aquí es dónde viene mi problema, ya que hasta que los partidos no han
finalizado el admin no podría ejecutar la acción NextRound, el problema
es que no sé como controlar que la jornada ha llegado a su fin.

2009/5/13 Carlos Belizón [email protected]

Es decir el partido cuando se va mostrar realmente está jugado
completamente pero se muestra “poco a poco” en tiempo real para dar
sensación de realismo.

Bueno, sigue pudiendo acceder a ellos.

Por un lado haces un name_scope para los que se jueguen.

named_scope :now_playing lambda { {:conditions => {:created_at =>
[(Time.now-1.minute)…(Time.now)] }}}

y luego añades un método.

def playing?
[(Time.now-1.minute)…(Time.now)].include? self.created_at
end

Y ya tienes esa franja viertual de un minuto.

Aunque igual he entendido mal lo que quieres.