2009-12-25 2 views
2

Я пытаюсь создать веб-игру в Ruby on Rails. У меня есть модель под названием «Игра», которая имеет дату и время в записи базы данных, которая соответствует времени, которое я хотел бы, чтобы сервер вызывал функцию update_game модели Game. В зависимости от настроек игры, это может быть каждые 30 секунд каждые 12 часов.События с временным сервером с рубинами на рельсах

Ruby on Rails только работает, когда получает HTTP-запрос; есть ли пятно способ обновить мою игру на периодической основе независимо от HTTP-запросов?

ответ

2

Для этого я бы посмотрел delayed_job. Когда игра начинается, вы можете создать delayed_job для первого обновления, и каждый запуск после этого может добавить новое задание с правильным интервалом до его завершения.

Я бы очень много тестировал;) - вы не хотите, чтобы задания уходили от вас.

1

Посмотрите варианты обработки фона и, возможно, cron.

2

Рельсы сами по себе этого не делают; cron делает это. Однако Ruby имеет a gem named Whenever, чтобы упростить декларирование и развертывание новых заданий cron.

Однако, если вы действительно ожидаете, что большое количество игр будет надежно обновляться каждые 30 секунд, вы можете захотеть использовать другой подход, если обновление игры займет какое-то значительное количество времени. Возможно, после того, как игра будет доступна, игра может запускать обновление столько раз, сколько необходимо (например, если прошло 3 минуты и интервал 30 секунд, запустите 6 обновлений после запроса). Однако это может быть или не быть хорошим вариантом для вашей установки, поэтому выясните, какой метод более эффективен для ваших целей.

+0

Сложность обновления при каждом доступе к игре заключается в том, что в игре будут обновляться дочерние объекты и объекты внуков. Я бы поставил одинаковый код в каждом потомке игры, и, похоже, было бы легко ввести ошибки, если я добавлю внука, но забудьте добавить в файл before_filter, чтобы обновить игру, когда к ней обращаются. – Ryan

+0

Значит, это не один контроллер? Тогда я полагаю, что cron определенно выступает в качестве лучшего решения. Всякий раз, когда это отличный инструмент :) – Matchu

+1

Если вы беспокоитесь о том, чтобы забыть «before_filter», то почему бы вам не создать класс, который наследует ActionController, со всеми параметрами и методами, которые ему нужны, а затем унаследовать все ваши контроллеры От этого? – Trevoke

0

Мне нравится драгоценный камень «rufus-scheduler», который работает в Rails, хотя я не уверен, что вы можете программно добавить к нему больше задач.