2014-01-09 13 views
0

我想弄清楚如何編寫一個耙子任務,將採取模型訂閱並檢查數據庫中的每一行中的每個列。任何列日期爲false的行,它都會用某些內容更新User模型屬性。到目前爲止,我得到了:編寫耙子,檢查模型和數據庫,然後更新另一個模型

task :check_subscription => :environment do 

@subscription = Subscription.find(:all) 
for_each @subscription do |sub| 
    Date.today.strftime('%Y-%m-%d') == sub.expiry_date.strftime('%Y-%m-%d') 
end 
if false 
    User.subscription.user_id.update_attributed(:plan_id => '200') 
end 
end 

沒有真正的工作,我敢肯定我沒有這樣做的權利。

  1. 我有一個名爲Subscription.rb和User.rb兩款車型
  2. 訂閱數據庫中有一個名爲列EXPIRY_DATE
  3. 用戶有一欄plan_id的數據類型應該,如果他們的訂閱更新爲「200」是假的(過期)。
  4. 訂閱有列user_id和訂閱模型有belongs_to User
+0

你是什麼意思「沒有真正的工作」?請出示日誌。 –

+0

我不認爲'for_each'是標準的Ruby。同樣在'Date.today.strftime('%Y-%m-%d')== sub.expiry_date.strftime('%Y-%m-%d')'你爲什麼要比較今天的日期和到期日但對結果無能爲力?而'if false'塊永遠不會執行。 – Bobby

回答

1
task :check_subscription => :environment do 
    # Select expired subscriptions 
    expired_subscriptions = Subscription.where("expiry_date < ?", Time.now.beginning_of_day) 
    # Select user ids of all expired subscriptions. 
    expired_subscription_user_ids = expired_subscriptions.pluck(:user_id) 
    # Update all users with id = expired_subscription_user_ids so that their plan_id is 200 
    User.update_all({:plan_id => '200'}, {:id => expired_subscription_user_ids}) 

    # Delete the expired subscriptions 
    expired_subscriptions.delete 
end 
+0

謝謝對於你的提示,實際上你的沒有給出一個錯誤,除了NOW()不是一個SQL,而是幾乎沒有修改,我想出了類似的東西; – user2419316

+0

'#選擇截止日期在當前時間之前的所有訂閱的用戶ID。 \t expired_subscription_user_ids = Subscription.where( 「EXPIRY_DATE <?」,Time.now.beginning_of_day).pluck(:USER_ID) \t#更新所有用戶使用id = expired_subscription_user_ids使得它們的plan_id的數據類型是200 \t User.update_all({: plan_id =>''},{:id => expired_subscription_user_ids})' – user2419316

+0

有沒有辦法告訴它在'User.update_all'執行後刪除訂閱? – user2419316

0

可以在單個語句update_all可能做到這一點:

User.joins(:subscriptions).where("subscriptions.expiry_date < ?", Time.now.beginning_of_day).update_all("users.plan_id = 200") 

幾個其他的想法/想法:

  1. 你也可以只執行一個簡單的SQL更新語句
  2. 如果這是一次性轉換,那麼這可能會發生在遷移而不是獨立的rake任務中
  3. 如果這是一個反覆出現的事情,則需要包含某種可以調用任務的調度組件。
+0

嘿謝謝你的提示。是的,這將是一個反覆出現的事情,耙將每天運行一次。我會繞過你的代碼,看看它是否適合。再次感謝幫助我找到一個起點 – user2419316

+0

任何想法爲什麼我得到'SQLite3 :: SQLException:near「。」:語法錯誤:' – user2419316

相關問題