【问题标题】:Destroying a Rails 3 object in rake?在 rake 中销毁 Rails 3 对象?
【发布时间】:2011-06-10 19:09:01
【问题描述】:

我在这里遇到了一个简单的问题。我正在构建一个管理优惠券数据库的应用程序,每个优惠券都有一个到期日期。我正在尝试构建一个将删除过期优惠券的 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,我敢肯定我不会有工作!

【问题讨论】:

    标签: ruby-on-rails rake


    【解决方案1】:

    你已经接近了。您只需要使用#destroy_all 方法而不是#destroy。后者需要一个 id 参数。

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

    【讨论】:

    • 像冠军一样工作,@Rob Davis。谢谢!
    【解决方案2】:

    首先,为了帮助从 rake 调试东西,使用 --trace 选项调用它。不过,您的问题并非特定于 rake。

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

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

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

    【讨论】:

    • 迭代有效,但 ActiveRecord::Relation 也定义了 #destroy_all 和 #delete_all 方法。
    • 这很有意义,@Aaron Hinni。感谢您的澄清。我还是 Rails 的新手,老实说,我对数组、集合和 Active Record 之间的关系只有一点点理解。我还有一些学习要做!
    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多