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