在rake中销毁Rails 3对象?

时间:2011-06-10 19:09:02

标签: ruby-on-rails rake

我在这里遇到一个简单的问题。我正在构建一个管理优惠券数据库的应用程序,每个优惠券都有一个到期日期。我正在尝试建立一个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,我很确定我没有工作!

2 个答案:

答案 0 :(得分:1)

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

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

您可以迭代每个过期的优惠并致电destroy。像这样:

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

答案 1 :(得分:1)

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

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