2011-01-19 3 views
0

У меня есть модель цикла с двумя полями: длительность (строка) и завершенная (булева). Когда пользователь создает цикл, они вводят продолжительность (скажем, 30 минут), и цикл установлен на не завершен (boolean 0). Как обновить эту запись базы данных после продолжительности цикла (30 минут), чтобы пометить цикл как полный (boolean 1)? Есть ли способ справиться с этим с помощью кода ruby ​​/ rails или мне нужно выполнить функцию javascript?Обновление базы данных после продолжительности (Ruby on Rails)

Цель состоит в том, чтобы найти и отобразить все завершенные циклы с использованием Cycle.all (: conditions ..) и вызвать базу данных SQL. Я написал «полный»? метод в модели цикла, который сравнивает возраст цикла с продолжительностью, но это бесполезно для методов поиска SQL.

Каков наилучший способ решить эту проблему? Благодаря!

ответ

2

Определить задачу рейка, которая работает что-то вроде ...

desc "Expire old cycles" 
task :cron => :environment do 
    expired = Cycle.all :conditions => ["expiration < ?", DateTime.now] 
    expired.each { |c| c.expire! } 
end 

Где c#expire! это метод, который будет пометить его как истек в базе данных. Затем установите rake cron для запуска через каждые N минут через cronjob.

Если вам удобно это делать в SQL, вы можете оптимизировать это, написав запрос, чтобы сделать UPDATE cycles SET complete = 1 WHERE expiration < NOW();.

+0

В любом случае, я мог бы сделать это без работы cron? Это будет использоваться в заводской среде, где статус цикла важен так, что он должен быть точным до минуты, для чего требуется выполнение задания cron каждую минуту. На общих серверах я читал, что это плохо. – aguynamedloren

+0

Вы можете прикрепить гораздо более эффективный необработанный SQL-запрос к каждому запрошенному запросу, поэтому он будет запускаться автоматически по мере использования приложения. Вы не можете сказать базе данных, чтобы сделать это автоматически по расписанию, хотя, если это то, к чему вы стремитесь. – coreyward

+0

В зависимости от того, как вы намерены взаимодействовать с этими данными, индексирование столбца истечения срока действия в базе данных и использование условия сравнения времени для вытягивания строк, которые неизучены (лживо), являются очень приемлемым вариантом. – coreyward