class StoredCourseProcess < ActiveRecord::Migration def up execute " CREATE PROCEDURE sp_course_cursor () BEGIN DECLARE course_uid int(10); DECLARE _done tinyint(1) DEFAULT 0; DECLARE cur_course CURSOR FOR SELECT `projects`.id FROM `projects` WHERE projects.status <> 9 AND projects.is_public = 1 AND projects.project_type = 1; DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = 1; OPEN cur_course; loop_course: LOOP FETCH cur_course INTO course_uid; IF _done = 1 THEN LEAVE loop_course; END IF; BEGIN DECLARE members_count int(4) DEFAULT 0; DECLARE attachments_count int(4) DEFAULT 0; DECLARE total_count int(4) DEFAULT 0; SELECT COUNT(*) INTO members_count FROM `members` inner join `users` WHERE `members`.`project_id` = course_uid AND `members`.`user_id` = `users`.`id` AND `users`.`type` = 'User' AND `users`.`status` = 1; SELECT COUNT(*) INTO attachments_count FROM `attachments` WHERE `attachments`.`container_id` = course_uid AND `attachments`.`container_type` = 'Project'; SET total_count = members_count + attachments_count; UPDATE project_statuses SET course_ac_para = total_count WHERE project_statuses.project_id = course_uid; COMMIT; END; END LOOP; END; " execute " CREATE EVENT IF NOT EXISTS e_project_status_course ON SCHEDULE EVERY 1 DAY STARTS '2013-08-27 01:50:00' ON COMPLETION PRESERVE DO CALL sp_course_cursor(); " execute " SET GLOBAL event_scheduler = ON; " end def down execute " DROP PROCEDURE IF EXISTS sp_course_cursor; " execute " DROP EVENT IF EXISTS e_project_status_course; " end end