通过rake任务删除Heroku(Rails 3.1)上的旧记录

Ada*_*amT 2 database activerecord ruby-on-rails heroku

我似乎无法从heroku上的应用程序中删除旧记录.

目前,heroku调度程序运行:

class Post < ActiveRecord::Base

def self.get_data
  # this populates my app but the database is starting to get large and I don't need the old records
  scr = Scrape.new
  data_array = scr.scrape
  store_data(data_array)
  # destroy_old_data
end
Run Code Online (Sandbox Code Playgroud)

但我想取消注释"destory_old_data"电话.

def destroy_old_data
  # oldest = Post.where("updated_at > ?", 30.days.ago)
  # Post.delete_all("updated_at > ?", 30.days.ago)
  # Post.destroy_all("updated_at > ?", 30.days.ago)
  oldest = Post.find(:all, "updated_at > ?", 30.days.ago)
  oldest.destroy
end
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我已经尝试了一些似乎在控制台本地工作但我无法让它们在heroku上工作的东西.

我得到的错误是:

ArgumentError: wrong number of arguments (2 for 1)

or

when using Post.find
NoMethodError: undefined method `destroy' for #<Array:0x00000004579898>
Run Code Online (Sandbox Code Playgroud)

我能够成功找到并删除所有这些旧记录的最简单的电话是什么?

任何援助将不胜感激.

jst*_*tim 5

要解决NoMethodError,您需要遍历记录数组并调用destroy每个记录.

oldest.each { |r| r.destroy }
Run Code Online (Sandbox Code Playgroud)

或者你可以使用像destroy_all你甚至不需要额外的方法find.http://apidock.com/rails/ActiveRecord/Base/destroy_all/class

Post.destroy_all(['updated_at < ?', 30.days.ago])
Run Code Online (Sandbox Code Playgroud)

将条件放在数组中应该将ArgumentError解析为他的答案中提到的@luke-chadwick.

要考虑的一个项目是您要删除的记录数量(这里是文档中的注释):

注意:当您一次删除多个记录时,实例化,回调执行和删除每条记录可能非常耗时.它为每条记录生成至少一个SQL DELETE查询(或者更多,以强制执行您的回调).如果要快速删除多行,而不关心其关联或回调,请改用delete_all.

delete_all 对你来说可能是一个更快的选择,除非你需要清理其他相关记录,比如评论.