2011-08-01 9 views
11

Chcę tworzyć powtarzające się wydarzenia przy użyciu klejnotu Ice Cube w Railsach - moje pytanie brzmi: jak wtedy poprawnie, lub raczej efektywnie, użyć tych cyklicznych zasady uruchamiania rzeczywistych zdarzeń?Prawidłowy sposób korzystania z wydarzeń utworzonych za pomocą kostki lodu w Railsach przy użyciu codziennego zadania cron

Przykładem może być powtarzająca się faktura.

Załóżmy, że mam cykl powtarzania się lodu raz w tygodniu i zapisałem go w wierszu faktury cyklicznej, używając to_yaml. Mam teraz wiersz w bazie danych z serializowaną zasadą powtarzania. Jedynym sposobem, jaki mogę sobie wyobrazić, jest użycie każdego wiersza w bazie danych, odserializowanie zapisanych reguł powtarzania i sprawdzenie, czy musi on zostać uruchomiony dzisiaj z schedule.occurs_on? (Date.new) - to byłoby następnie wprowadzone do cronjob, który działa codziennie:

items = RecurringItem.find(:all) 
items.each do |item| 
    schedule = Schedule.from_yaml(item.schedule_yaml) 
    if schedule.occurs_on?(Date.new) 
     #if today is a recurrence, do stuff! 
    end 
end 

Wygląda to dla mnie bardzo nieefektywnie - ale może to być całkowicie błędne. Czy nie ma lepszego sposobu na wykorzystanie Ice Cube?

+0

Spróbuj spojrzeć na to w dowolnym momencie, jest to całkiem proste w użyciu i działa przyjemnie. https://github.com/javan/whenever – MatthewFord

+0

Nie jestem zaznajomiony z Ice Cube, ale korzystamy z Resque Scheduler w mojej pracy regularnie (kalambur przeznaczony). Wyślij mi e-maila, jeśli miałbyś ochotę spróbować i potrzebujesz pomocy. – Tass

Odpowiedz

2

Ice Cube wydaje się specjalizują się w tworzeniu bardzo skomplikowanych harmonogramów (występuje w środy 1 i 4, ale tylko wtedy, gdy są one parzyste dni, a jeśli nie to weekend, itd.)

jeśli to potrzebujesz, to zadanie, które opisałeś, jest prawdopodobnie najbardziej wydajnym sposobem wykonywania wielu zadań każdego dnia na tego rodzaju złożonym harmonogramie. Jeśli nie potrzebujesz takiej złożoności w swoich harmonogramach, możesz spojrzeć na coś takiego, jak zawsze (jak wspomniał MatthewFord), które po prostu używa harmonogramów cron do ustawiania zadań do wykonania, ale jest to przeznaczone do zadań administracyjnych i wymaga tego plik konfiguracyjny do edycji i nie działa, jeśli musisz dodawać i usuwać elementy za pomocą interfejsu aplikacji.

Inną opcją korzystania z kostki lodu będzie comiesięczny cron przechodzący przez każdy harmonogram, a także skonfigurowanie kolejnej tabeli określającej, które zdarzenia będą musiały być uruchamiane w dniach, w których będzie następować następny miesiąc. (każdy wiersz ma datę i definicję zadania), a Twój dzienny cron może wybrać z tej tabeli ...

Trzeba również zaktualizować tę tabelę o jeden miesiąc przed każdym razem, gdy jeden z harmonogramów zmieni się w aplikacja ... rodzaj kłopotów, więc jeśli nie masz setek tysięcy harmonogramów do przejrzenia raz dziennie, prawdopodobnie nie jest to warte problemów.

+3

Zakończyłem pisanie własnego prostego harmonogramu. Pobiera wszystkie wiersze, które muszą zostać uruchomione dzisiaj, wykonaj co trzeba z wierszem, a następnie ustaw datę następnego uruchomienia wiersza na dzień dzisiejszy + miesiąc/tydzień/dzień, w zależności od tego, co jest ustawione. –

0

Ponieważ używasz Ice_cube, możesz zajrzeć do Sidetiq. Korzysta z funkcji ice_cube do określenia harmonogramu zadań, więc łatwo będzie się zawiesić.

Zamiast sprawdzać wszystkie rekordy, aby znaleźć te, które kwalifikują się, moja próba będzie generować zaplanowane zdarzenia w oparciu o te zasady, ale myślę, że jest wiele sposobów, aby to zrobić może być bardziej wydajne.

Powiązane problemy