2016-03-03 55 views
0

我需要系統每天運行以下代碼,但我不知道如何做到這一點。Rails Everyday Action

@user = User.all 
date = Date.today 
if date.workingday? 
    @user.each do |user| 
    if !Bank.where(:user_id => user.id , :created_at => (date.beginning_of_day..date.end_of_day) , :bank_type => 2).exists? 
     banco = Bank.new() 
     banco.user = user 
     banco.bank_type = 2 
     banco.hours = 8 
     banco.save 
    end 
end 
end 
+0

看看[發條](https://github.com/tomykaira/clockwork)寶石。 –

回答

1

最常規的方法是將此設爲可以在cron jobrails runner執行。

有像whenever這樣的工具,通過定義需要在Ruby中執行的頻率而不是特殊的,有時難以理解的格式來更容易地創建這些作業。

作爲說明,User.all是一個非常危險的事情。隨着系統中用戶數量的增長,將它們全部加載到內存中將最終炸燬您的服務器。您應該將它們加載到100個左右的組中,以避免內存過載。

此外,如果您在此處設置了適當的has_manybelongs_to關係,則該where子句不應該是必需的。我希望這會工作:

unless (user.bank) 
    user.create_bank(
    bank_type: 2, 
    hours: 8 
) 
end 

目前尚不清楚如何在created_at因素在這裏。這些是每天分配的嗎?如果是這樣,那應該是類似於bank_date那樣的DATE類型列,而不是日期和時間。使用created_at時間戳作爲關係的一部分是要求麻煩,這應該反映創建記錄的時間,僅此而已。

+0

感謝您的建議,除非我沒有聽說過。我也是新來的紅寶石和鐵軌。關於created_at,我使用的是 ,因爲已經創建。在這句話,你給了我如何捕捉,如果它今天? 我想到使用和參數 –

+0

如果您需要每天創建這些記錄中的一個,您需要一個「DATE」字段來捕獲它們與之關聯的那一天。然後你可以做'除非(user.banks.where(on_date:date))'爲今天的特定日期或'Date.today'找到一個。 – tadman

相關問題