在rake中销毁Rails 3对象?

我在这里遇到一个简单的问题。 我正在构建一个管理优惠券数据库的应用程序,每个优惠券都有一个到期日期。 我正在尝试建立一个rake任务,删除过期的优惠券。 rakefile中的相关代码如下所示:

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 

所以我有点想法。 我在这做错了什么?

非常感谢你的帮助。 如果不是Stack Overflow,我很确定我没有工作!

你很亲密 您只需要使用#destroy_all方法而不是#destroy 。 后者需要一个id参数。

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

首先,为了帮助调试rake中的东西,使用--trace选项调用它。 这里你的问题不是rake特定的。

Offer.where('expires_on < ?', today)将返回一个集合,而不是一个Offer实例,并且没有可用于集合的destroy方法。

您可以迭代每个过期的商品并调用destroy 。 像这样的东西:

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