2011-06-10 93 views
0

我在這裏遇到了一個簡單的問題。我正在構建一個管理優惠券數據庫的應用程序,每個優惠券都有一個到期日期。我正在嘗試構建一個將刪除過期優惠券的佣金任務。從Rake文件相關的代碼如下所示:耙耙銷燬Rails 3對象?

desc "Deletes expired offers from the database." 
task :purge_expired => :environment do 
    today = Date.today.to_s    
    Offer.where('expires_on < ?', today).destroy 
end 

這不過失敗,出現以下錯誤信息:

rake aborted! 
wrong number of arguments (0 for 1) 

我只是不知道爲什麼。需要哪些論據?

作爲一個實驗,我發現這工作得很好:

desc "Deletes expired offers from the database." 
task :purge_expired => :environment do 
    today = Date.today.to_s    
    puts Offer.where('expires_on < ?', today).count 
end 

這返回的記錄正確的號碼,所以我想我成功地收拾正確的對象。

FWIW,我想這也和沒有運氣:

desc "Deletes expired offers from the database." 
task :purge_expired => :environment do 
    today = Date.today.to_s 
    @offers = Offer.where('expires_on < ?', today) 
    @offers.destroy 
end 

所以我有點出出主意。我在這裏做錯了什麼?

非常感謝您的幫助。如果不是堆棧溢出,我敢肯定我沒有工作!

回答

1

你很近。您只需使用#destroy_all方法而不是#destroy。後者需要一個id參數。

today = Date.today.to_s    
Offer.where('expires_on < ?', today).destroy_all 
+0

就像一個冠軍,@Rob戴維斯。謝謝! – 2011-06-10 20:31:55

1

首先,爲了幫助從rake中進行調試,請使用--trace選項調用它。儘管如此,你的問題不是特定的。

Offer.where('expires_on < ?', today)將返回一個集合,而不是一個Offer實例,並且沒有可用於該集合的destroy方法。

您可以遍歷每個過期的報價並致電destroy。類似這樣的:

@offers = Offer.where('expires_on < ?', today) 
@offers.each { |offer| offer.destroy } 
+0

迭代工作,但ActiveRecord :: Relation也定義#destroy_all和#delete_all方法。 – 2011-06-10 20:30:21

+0

@Aaron Hinni,這很有意義。感謝澄清。我對Rails還是一個新手,對於數組,集合和Active Record的關係只有一種細緻的理解。我還有一些學習要做! – 2011-06-10 20:33:07