Timer po stronie serwera

Pewnie nie lubicie takich otwartych pytań, ale przyznam że nie wiem jak za to się zabrać.

Chciałbym zrobić timer, który po określonym czasie wykona jakąś akcję. Przykładowo:

  1. Użytkownik wciska przycisk, ładuje formularz i aktywuje timer.
  2. Po czasie określonym przez użytkownika, aplikacja tworzy rekord w bazie danych (Model.create) I robi jeszcze kilka rzeczy.

Jak się za to zabrać?

Możesz użyć np. https://github.com/collectiveidea/delayed_job

Poszukaj sobie w w/w dokumentacji jak działa run_at.

Dzięki, świetnie działa jednak mam pewien problem.

Aby korzystać z Model.delay.method metoda musi być “klasowa”.

I wszystko byłoby fajnie, bo zauważyłem że job zapamiętuje dane wejściowe metody w momencie wywołania, ale samą metodę wykonuje później. I na tym mi zależało, jednak używając self.method nie mogę otrzymać aktualnych danych ani korzystać z metod instancji.

Przykładowo podczas wejścia użytkownika na stronę, wraz z generowaniem widoku, chcę odpalić timer :
QuizzesController.delay(run_at: @quiz.time_limit.minutes.from_now).form_timeout(session[:user_id],session[:test_password])

A metoda form_timeout wyglada tak:

def self.form_timeout(id, test_password)
  if test_password == session[:test_password]
    Score.create(user_id: id, name: test_password, points: -1) 
    session.delete(:test_password)
  end
end

Wyskakuje mi błąd że metoda session jest undefined.
Przede wszystkim: Jak przekazać aktualne dane z aplikacji do klasowej metody ergo jaki jest sposób abym mógł użyć session (aktualnego na czas wykonania metody) w tak wyglądającym scenariuszu?
Dodatkowo: jaki jest sposób aby móc używać klas instancjonowanych w takim scenariuszu?

@Edit Czy mogę wywołać metodę “instancjową” z poziomu metody klasy i przekazać tej pierwszej parametry z tej drugiem (np. returnem)?

@Edit2 Nie mogę, ale rozwiązałem już problem w inny sposób.