0

テーブル Product があるとします。

+---+------+--------+--------------+
| id|  name| status | expiry_date  |
+---+------+--------+--------------+
| 1 |   A  | Good   | 10 min ago   | <-- this supposed to be "Expired"
| 2 |   B  | Good   | 10 min later | 
+---+------+--------+--------------+

私の質問は、有効期限が過ぎているため、ID 1 のステータスを「期限切れ」に設定する方法です。

私は通常、これを cron タスクで行いました。ただし、テーブル全体を読み取って数行を見つけるのは効率的ではないと思います。さらに、cron タスクは、間隔が来るまでステータスを更新しません (つまり、10 分、20 分など)。

できるだけ早くステータスを更新できるように、時間に達したときにすぐにプロセスをトリガーする方法はありますか?

私の質問が明確であることを願っています。

4

1 に答える 1

0

更新を実行するコントローラーのアクションを暗示する場合は、次のように実行できます。

Product.where(["expire_date < ?", ->{ Time.now.utc - 10.minutes }.call]).update_all(:status, 'Bad')

更新しました。または、特定のIDで単一の製品のみを更新する場合:

product = Product.find(params[:id])

if product.expire_date < Time.now.utc - 10.minutes
  product.status = 'Bad'
  product.save
end
于 2012-05-15T14:58:50.313 に答える