2011-06-10 40 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