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

时间:2012-01-25 19:48:09

标签: ruby-on-rails database activerecord 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

但我想取消注释“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

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

我得到的错误就像:

ArgumentError: wrong number of arguments (2 for 1)

or

when using Post.find
NoMethodError: undefined method `destroy' for #<Array:0x00000004579898>

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

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您正在尝试对数组进行“删除”,即帖子列表。您应该在该列表中的每个项目上调用删除。

Post.where(["updated_at > ?", 30.days.ago]).each do |post|
  post.delete
end

在哪里,采取一个论点。并返回符合其条件的帖子列表。然后,您可以遍历这些帖子并对每个帖子执行操作(delete)。

答案 1 :(得分:1)

Post.destroy_all方法接受任何可以传递给find(:all)的conditions参数的内容。这包括字符串,散列或数组。

如果您在documentation中显示来源以进行销毁,那么您应该看到:

# File activerecord/lib/active_record/base.rb, line 879
def destroy_all(conditions = nil)
  find(:all, :conditions => conditions).each { |object| object.destroy }
end

正如您所看到的,它需要一个参数。因此需要将条件包装在数组括号中(如图所示):

Post.destroy_all(['updated_at > ?', 30.days.ago])