2011-01-19 8 views
0

私は期間(文字列)と完了(ブール値)の2つのフィールドを持つサイクルモデルを持っています。ユーザーがサイクルを作成すると、持続時間(30分)が入力され、サイクルは完了しない(ブール値0)に設定されます。サイクル期間(30分)後にそのデータベースエントリを更新して、サイクルを完了(ブール値1)としてマークするにはどうすればよいですか? ruby/railsコードでこれを処理する方法はありますか、またはjavascript関数を実行する必要がありますか?期間の後にデータベースを更新する(Ruby on Rails)

目的は、完了したすべてのサイクルをCycle.all(:conditions ..)を使用して検索して表示し、SQLデータベースを呼び出すことです。私は「完全な?」と書いた。サイクルの年齢を期間と比較するサイクルモデルのメソッドですが、これはSQLのfindメソッドでは無用です。

これに取り組む最も良い方法は何ですか?ありがとう!

答えて

2

... c#expire!がデータベースに期限切れとしてマークされます方法です

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

を何かのように実行しますrakeタスクを定義します。次に、クローンジョブでN分ごとに実行するようにrake cronを設定します。

SQLでこの作業を行うのが快適な場合は、UPDATE cycles SET complete = 1 WHERE expiration < NOW();というクエリを作成して最適化することができます。

+0

どのようにしても、私はcronジョブなしでこれを達成できますか?これは、サイクルの状態が重要であるような工場環境で使用され、分まで正確でなければならず、毎分cronジョブを実行する必要があります。共有サーバーでは、これはうまくいかないと読んだことがあります。 – aguynamedloren

+0

作成されたすべての要求に対して、よりパフォーマンスの良い生のSQLクエリを添付することができるため、アプリケーションが使用されると自動的に実行されます。しかし、あなたが目指しているのであれば、スケジュールに従って自動的にこれを行うようデータベースに指示することはできません。 – coreyward

+0

このデータとのやりとりの仕方によっては、データベース内の有効期限列を索引付けし、時間比較条件を使用して遅れていない列を引き出すだけで、(現時点では)すぐれた選択肢です。 – coreyward

関連する問題