2010-12-15 112 views
1

我正在製作一個名爲「圖書俱樂部」的應用程序。系統中將有很多書和票。每個月,在本月的第一天,我需要系統自動將具有最高票數的書籍推薦爲「本月書」。推銷一本書並確保每月只有一本書的邏輯已經實施。Rails應用程序需要每月執行一次任務

book.promote! 

可愛吧?

我有我的測試情況下hurr

Given the following books exist: 
    | title    | author   | year_published | votes | created_at  | 
    | Lord of the Flies | William Golding | 1954   | 18 | January 12, 2010 | 
    | The Virgin Suicides | Jeffrey Eugenides | 1993   | 12 | February 15, 2010 | 
    | Island    | Richard Laymon | 1991   | 6  | November 22, 2009 | 
And the book "Lord of the Flies" is the current book of the month 
And the date is "February 24, 2010" 
Then the book "Lord of the Flies" should be the current book of the month 
When the date is "March 1, 2010" 
And I am on the home page 
Then I should see "This Month's Book of the Month Club Book" 
And I should see "The Virgin Suicides" 
And the book "The Virgin Suicides" should be the current book of the month 
And the book "Lord of the Flies" should not be the current book of the month 
And the book "Island" should not be the current book of the month 

而我試圖讓通過。

所以問題是,我該如何最好地實現自動的,每月一次的更新,可以通過這種情況來測試?

克朗對我的口味有點過於sl。。我想要一個更便攜的解決方案。

delayed_job/Resque對於這種情況似乎有點過重。此外,我還不確定如何讓他們每月運行一次工作。

只是尋找一個簡單,但強大的TESTABLE解決方案。

歡呼,一如既往!

+1

如果你可以解釋爲什麼'cron'對你來說太sl I,我可以建議更好的選擇。 – Swanand 2010-12-15 04:13:41

+0

要使用cron,我必須在我的測試套件中開始做出假設。我可以完成cron作業調用並測試的rake任務,但是我仍然假定cron作業將在我的環境中設置。也許我在那個時候有點兒迂腐,但它不能覆蓋這個系統的關鍵方面並不合適。 – drmanitoba 2010-12-15 15:37:18

回答

1

一個很好的方法來管理週期性任務是每當:https://github.com/javan/whenever

我確實使用OS的cron,但所有的配置你的生活Rails應用程序裏面,所以它的更好的工作。

然而,對於維護類型的任務而言,如果出於某種原因某些原因不能在某小時的頂部運行或因某種原因而被忽略,那麼這對於維護類型任務來說是非常合適的,鬆弛將會被接下來時間,在你的情況下,週期性的事情是任務的一部分,這是一個更強硬的呼叫。

也許應用程序可以只是「問」自己它是否是本月的第一個排名視圖加載的時間,如果是,它會在適當的日期範圍內僅使用投票來完成計數?

,並測試時間相關的行爲,checkout出來時空特警:https://github.com/jtrupiano/timecop

+0

我曾想過在ApplicationController上用before_filter做「總是問自己」的方法,但我開始懷疑這是否會成爲每次請求中不必要的資源浪費。 – drmanitoba 2010-12-15 04:15:10

0

正如約翰開始說的Cron /只要是去這裏的路。其他後臺守護進程需要一個單獨的進程,大部分時間都是空閒的。除非您擔心在Windows上運行,否則不應該對cron有任何可移植性問題。

0

我們在這裏談論2不同的東西:

  1. 運行並執行系統任務的作業:這將是通過rake,它是非常可靠和行之有效的。
  2. 調度程序,它根據您指定的計劃運行此任務。看來你正在尋找cron的替代品。你可以試試launchd
1

我對這種類型的需求使用delayed_job。

class Book 
    def promote 
    # code for the promote method.. 

    ensure 
    # re-run the task in another 30 days. 
    promote 
    end 
    # Date.today.nextmonth.beginning_of_month will be evaluated 
    #when promote is called 
    handle_asynchronously :promote, :run_at => Proc.new { 
    Date.today.next_month.beginning_of_month 
    } 

end 
+0

我對DJ不太熟悉。一旦我設置完成,我將如何將該任務添加到隊列中? – drmanitoba 2010-12-16 03:47:20

+0

在書對象上調用一次'promote'方法,這會將作業添加到隊列中。從這一點開始,這個方法將每個月調用一次。 – 2010-12-16 11:37:07

0

delayed_job是一個不錯的選擇。您目前正在使用少量書籍進行測試,因此計算速度相當快。

當您的應用擴展時,您需要在單獨的工作進程中運行此計算以減少對用戶體驗的影響。 delayed_job會一箭雙鵰:提供調度機制並將計算卸載到單獨的工作進程。

相關問題